OLD | NEW |
1 //===-- TargetMachine.cpp - General Target Information ---------------------==// | 1 //===-- TargetMachine.cpp - General Target Information ---------------------==// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file describes the general parts of a Target machine. | 10 // This file describes the general parts of a Target machine. |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "llvm/MC/MCContext.h" | 23 #include "llvm/MC/MCContext.h" |
24 #include "llvm/MC/MCTargetOptions.h" | 24 #include "llvm/MC/MCTargetOptions.h" |
25 #include "llvm/MC/SectionKind.h" | 25 #include "llvm/MC/SectionKind.h" |
26 #include "llvm/Support/CommandLine.h" | 26 #include "llvm/Support/CommandLine.h" |
27 #include "llvm/Target/TargetLowering.h" | 27 #include "llvm/Target/TargetLowering.h" |
28 #include "llvm/Target/TargetLoweringObjectFile.h" | 28 #include "llvm/Target/TargetLoweringObjectFile.h" |
29 #include "llvm/Target/TargetSubtargetInfo.h" | 29 #include "llvm/Target/TargetSubtargetInfo.h" |
30 using namespace llvm; | 30 using namespace llvm; |
31 | 31 |
32 //--------------------------------------------------------------------------- | 32 //--------------------------------------------------------------------------- |
| 33 |
| 34 // @LOCALMOD-BEGIN |
| 35 namespace llvm { |
| 36 bool TLSUseCall; |
| 37 } |
| 38 |
| 39 // Use a function call to get the thread pointer for TLS accesses, |
| 40 // instead of using inline code. |
| 41 static cl::opt<bool, true> |
| 42 EnableTLSUseCall("mtls-use-call", |
| 43 cl::desc("Use a function call to get the thread pointer for TLS accesses."), |
| 44 cl::location(TLSUseCall), |
| 45 cl::init(false)); |
| 46 |
| 47 static cl::opt<bool> |
| 48 ForceTLSNonPIC("force-tls-non-pic", |
| 49 cl::desc("Force TLS to use non-PIC models"), |
| 50 cl::init(false)); |
| 51 // @LOCALMOD-END |
| 52 |
33 // TargetMachine Class | 53 // TargetMachine Class |
34 // | 54 // |
35 | 55 |
36 TargetMachine::TargetMachine(const Target &T, | 56 TargetMachine::TargetMachine(const Target &T, |
37 StringRef TT, StringRef CPU, StringRef FS, | 57 StringRef TT, StringRef CPU, StringRef FS, |
38 const TargetOptions &Options) | 58 const TargetOptions &Options) |
39 : TheTarget(T), TargetTriple(TT), TargetCPU(CPU), TargetFS(FS), | 59 : TheTarget(T), TargetTriple(TT), TargetCPU(CPU), TargetFS(FS), |
40 CodeGenInfo(nullptr), AsmInfo(nullptr), | 60 CodeGenInfo(nullptr), AsmInfo(nullptr), |
41 RequireStructuredCFG(false), | 61 RequireStructuredCFG(false), |
42 Options(Options) { | 62 Options(Options) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { | 125 TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { |
106 bool isLocal = GV->hasLocalLinkage(); | 126 bool isLocal = GV->hasLocalLinkage(); |
107 bool isDeclaration = GV->isDeclaration(); | 127 bool isDeclaration = GV->isDeclaration(); |
108 bool isPIC = getRelocationModel() == Reloc::PIC_; | 128 bool isPIC = getRelocationModel() == Reloc::PIC_; |
109 bool isPIE = Options.PositionIndependentExecutable; | 129 bool isPIE = Options.PositionIndependentExecutable; |
110 // FIXME: what should we do for protected and internal visibility? | 130 // FIXME: what should we do for protected and internal visibility? |
111 // For variables, is internal different from hidden? | 131 // For variables, is internal different from hidden? |
112 bool isHidden = GV->hasHiddenVisibility(); | 132 bool isHidden = GV->hasHiddenVisibility(); |
113 | 133 |
114 TLSModel::Model Model; | 134 TLSModel::Model Model; |
115 if (isPIC && !isPIE) { | 135 if (isPIC && !isPIE && |
| 136 !ForceTLSNonPIC) { // @LOCALMOD |
116 if (isLocal || isHidden) | 137 if (isLocal || isHidden) |
117 Model = TLSModel::LocalDynamic; | 138 Model = TLSModel::LocalDynamic; |
118 else | 139 else |
119 Model = TLSModel::GeneralDynamic; | 140 Model = TLSModel::GeneralDynamic; |
120 } else { | 141 } else { |
121 if (!isDeclaration || isHidden) | 142 if (!isDeclaration || isHidden) |
122 Model = TLSModel::LocalExec; | 143 Model = TLSModel::LocalExec; |
123 else | 144 else |
124 Model = TLSModel::InitialExec; | 145 Model = TLSModel::InitialExec; |
125 } | 146 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel); | 207 Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel); |
187 } | 208 } |
188 | 209 |
189 MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const { | 210 MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const { |
190 SmallString<60> NameStr; | 211 SmallString<60> NameStr; |
191 getNameWithPrefix(NameStr, GV, Mang); | 212 getNameWithPrefix(NameStr, GV, Mang); |
192 const TargetLoweringObjectFile &TLOF = | 213 const TargetLoweringObjectFile &TLOF = |
193 getSubtargetImpl()->getTargetLowering()->getObjFileLowering(); | 214 getSubtargetImpl()->getTargetLowering()->getObjFileLowering(); |
194 return TLOF.getContext().GetOrCreateSymbol(NameStr.str()); | 215 return TLOF.getContext().GetOrCreateSymbol(NameStr.str()); |
195 } | 216 } |
OLD | NEW |