]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- SystemZSubtarget.cpp - SystemZ subtarget information --------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | ||
10 | #include "SystemZSubtarget.h" | |
11 | #include "MCTargetDesc/SystemZMCTargetDesc.h" | |
12 | #include "llvm/IR/GlobalValue.h" | |
13 | #include "llvm/Support/Host.h" | |
14 | ||
15 | using namespace llvm; | |
16 | ||
17 | #define DEBUG_TYPE "systemz-subtarget" | |
18 | ||
19 | #define GET_SUBTARGETINFO_TARGET_DESC | |
20 | #define GET_SUBTARGETINFO_CTOR | |
21 | #include "SystemZGenSubtargetInfo.inc" | |
22 | ||
23 | // Pin the vtable to this file. | |
24 | void SystemZSubtarget::anchor() {} | |
25 | ||
26 | SystemZSubtarget & | |
27 | SystemZSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) { | |
28 | std::string CPUName = CPU; | |
29 | if (CPUName.empty()) | |
30 | CPUName = "generic"; | |
31 | #if defined(__linux__) && defined(__s390x__) | |
32 | if (CPUName == "generic") | |
33 | CPUName = sys::getHostCPUName(); | |
34 | #endif | |
35 | // Parse features string. | |
36 | ParseSubtargetFeatures(CPUName, FS); | |
37 | return *this; | |
38 | } | |
39 | ||
40 | SystemZSubtarget::SystemZSubtarget(const std::string &TT, | |
41 | const std::string &CPU, | |
42 | const std::string &FS, | |
43 | const TargetMachine &TM) | |
44 | : SystemZGenSubtargetInfo(TT, CPU, FS), HasDistinctOps(false), | |
45 | HasLoadStoreOnCond(false), HasHighWord(false), HasFPExtension(false), | |
46 | HasFastSerialization(false), HasInterlockedAccess1(false), | |
47 | TargetTriple(TT), | |
48 | // Make sure that global data has at least 16 bits of alignment by | |
49 | // default, so that we can refer to it using LARL. We don't have any | |
50 | // special requirements for stack variables though. | |
51 | DL("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64"), | |
52 | InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM), | |
53 | TSInfo(DL), FrameLowering() {} | |
54 | ||
55 | // Return true if GV binds locally under reloc model RM. | |
56 | static bool bindsLocally(const GlobalValue *GV, Reloc::Model RM) { | |
57 | // For non-PIC, all symbols bind locally. | |
58 | if (RM == Reloc::Static) | |
59 | return true; | |
60 | ||
61 | return GV->hasLocalLinkage() || !GV->hasDefaultVisibility(); | |
62 | } | |
63 | ||
64 | bool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV, | |
65 | Reloc::Model RM, | |
66 | CodeModel::Model CM) const { | |
67 | // PC32DBL accesses require the low bit to be clear. Note that a zero | |
68 | // value selects the default alignment and is therefore OK. | |
69 | if (GV->getAlignment() == 1) | |
70 | return false; | |
71 | ||
72 | // For the small model, all locally-binding symbols are in range. | |
73 | if (CM == CodeModel::Small) | |
74 | return bindsLocally(GV, RM); | |
75 | ||
76 | // For Medium and above, assume that the symbol is not within the 4GB range. | |
77 | // Taking the address of locally-defined text would be OK, but that | |
78 | // case isn't easy to detect. | |
79 | return false; | |
80 | } |