1 //===-- TargetMachine.cpp - General Target 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 // This file describes the general parts of a Target machine. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Target/TargetMachine.h" 15 #include "llvm/Analysis/TargetTransformInfo.h" 16 #include "llvm/CodeGen/MachineFunction.h" 17 #include "llvm/IR/Function.h" 18 #include "llvm/IR/GlobalAlias.h" 19 #include "llvm/IR/GlobalValue.h" 20 #include "llvm/IR/GlobalVariable.h" 21 #include "llvm/IR/Mangler.h" 22 #include "llvm/MC/MCAsmInfo.h" 23 #include "llvm/MC/MCCodeGenInfo.h" 24 #include "llvm/MC/MCContext.h" 25 #include "llvm/MC/MCInstrInfo.h" 26 #include "llvm/MC/MCSectionMachO.h" 27 #include "llvm/MC/MCTargetOptions.h" 28 #include "llvm/MC/SectionKind.h" 29 #include "llvm/IR/LegacyPassManager.h" 30 #include "llvm/Support/CommandLine.h" 31 #include "llvm/Target/TargetLowering.h" 32 #include "llvm/Target/TargetLoweringObjectFile.h" 33 #include "llvm/Target/TargetSubtargetInfo.h" 34 using namespace llvm; 35 36 //--------------------------------------------------------------------------- 37 // TargetMachine Class 38 // 39 40 TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString, 41 StringRef TT, StringRef CPU, StringRef FS, 42 const TargetOptions &Options) 43 : TheTarget(T), DL(DataLayoutString), TargetTriple(TT), TargetCPU(CPU), 44 TargetFS(FS), CodeGenInfo(nullptr), AsmInfo(nullptr), MRI(nullptr), 45 MII(nullptr), STI(nullptr), RequireStructuredCFG(false), 46 Options(Options) {} 47 48 TargetMachine::~TargetMachine() { 49 delete CodeGenInfo; 50 delete AsmInfo; 51 delete MRI; 52 delete MII; 53 delete STI; 54 } 55 56 /// \brief Reset the target options based on the function's attributes. 57 // FIXME: This function needs to go away for a number of reasons: 58 // a) global state on the TargetMachine is terrible in general, 59 // b) there's no default state here to keep, 60 // c) these target options should be passed only on the function 61 // and not on the TargetMachine (via TargetOptions) at all. 62 void TargetMachine::resetTargetOptions(const Function &F) const { 63 #define RESET_OPTION(X, Y) \ 64 do { \ 65 if (F.hasFnAttribute(Y)) \ 66 Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \ 67 } while (0) 68 69 RESET_OPTION(LessPreciseFPMADOption, "less-precise-fpmad"); 70 RESET_OPTION(UnsafeFPMath, "unsafe-fp-math"); 71 RESET_OPTION(NoInfsFPMath, "no-infs-fp-math"); 72 RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math"); 73 RESET_OPTION(DisableTailCalls, "disable-tail-calls"); 74 } 75 76 /// getRelocationModel - Returns the code generation relocation model. The 77 /// choices are static, PIC, and dynamic-no-pic, and target default. 78 Reloc::Model TargetMachine::getRelocationModel() const { 79 if (!CodeGenInfo) 80 return Reloc::Default; 81 return CodeGenInfo->getRelocationModel(); 82 } 83 84 /// getCodeModel - Returns the code model. The choices are small, kernel, 85 /// medium, large, and target default. 86 CodeModel::Model TargetMachine::getCodeModel() const { 87 if (!CodeGenInfo) 88 return CodeModel::Default; 89 return CodeGenInfo->getCodeModel(); 90 } 91 92 /// Get the IR-specified TLS model for Var. 93 static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) { 94 switch (GV->getThreadLocalMode()) { 95 case GlobalVariable::NotThreadLocal: 96 llvm_unreachable("getSelectedTLSModel for non-TLS variable"); 97 break; 98 case GlobalVariable::GeneralDynamicTLSModel: 99 return TLSModel::GeneralDynamic; 100 case GlobalVariable::LocalDynamicTLSModel: 101 return TLSModel::LocalDynamic; 102 case GlobalVariable::InitialExecTLSModel: 103 return TLSModel::InitialExec; 104 case GlobalVariable::LocalExecTLSModel: 105 return TLSModel::LocalExec; 106 } 107 llvm_unreachable("invalid TLS model"); 108 } 109 110 TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { 111 bool isLocal = GV->hasLocalLinkage(); 112 bool isDeclaration = GV->isDeclaration(); 113 bool isPIC = getRelocationModel() == Reloc::PIC_; 114 bool isPIE = Options.PositionIndependentExecutable; 115 // FIXME: what should we do for protected and internal visibility? 116 // For variables, is internal different from hidden? 117 bool isHidden = GV->hasHiddenVisibility(); 118 119 TLSModel::Model Model; 120 if (isPIC && !isPIE) { 121 if (isLocal || isHidden) 122 Model = TLSModel::LocalDynamic; 123 else 124 Model = TLSModel::GeneralDynamic; 125 } else { 126 if (!isDeclaration || isHidden) 127 Model = TLSModel::LocalExec; 128 else 129 Model = TLSModel::InitialExec; 130 } 131 132 // If the user specified a more specific model, use that. 133 TLSModel::Model SelectedModel = getSelectedTLSModel(GV); 134 if (SelectedModel > Model) 135 return SelectedModel; 136 137 return Model; 138 } 139 140 /// getOptLevel - Returns the optimization level: None, Less, 141 /// Default, or Aggressive. 142 CodeGenOpt::Level TargetMachine::getOptLevel() const { 143 if (!CodeGenInfo) 144 return CodeGenOpt::Default; 145 return CodeGenInfo->getOptLevel(); 146 } 147 148 void TargetMachine::setOptLevel(CodeGenOpt::Level Level) const { 149 if (CodeGenInfo) 150 CodeGenInfo->setOptLevel(Level); 151 } 152 153 TargetIRAnalysis TargetMachine::getTargetIRAnalysis() { 154 return TargetIRAnalysis( 155 [this](Function &) { return TargetTransformInfo(getDataLayout()); }); 156 } 157 158 static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo, 159 const MCSection &Section) { 160 if (!AsmInfo.isSectionAtomizableBySymbols(Section)) 161 return true; 162 163 // If it is not dead stripped, it is safe to use private labels. 164 const MCSectionMachO &SMO = cast<MCSectionMachO>(Section); 165 if (SMO.hasAttribute(MachO::S_ATTR_NO_DEAD_STRIP)) 166 return true; 167 168 return false; 169 } 170 171 void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name, 172 const GlobalValue *GV, Mangler &Mang, 173 bool MayAlwaysUsePrivate) const { 174 if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) { 175 // Simple case: If GV is not private, it is not important to find out if 176 // private labels are legal in this case or not. 177 Mang.getNameWithPrefix(Name, GV, false); 178 return; 179 } 180 SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, *this); 181 const TargetLoweringObjectFile *TLOF = getObjFileLowering(); 182 const MCSection *TheSection = TLOF->SectionForGlobal(GV, GVKind, Mang, *this); 183 bool CannotUsePrivateLabel = !canUsePrivateLabel(*AsmInfo, *TheSection); 184 TLOF->getNameWithPrefix(Name, GV, CannotUsePrivateLabel, Mang, *this); 185 } 186 187 MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const { 188 SmallString<128> NameStr; 189 getNameWithPrefix(NameStr, GV, Mang); 190 const TargetLoweringObjectFile *TLOF = getObjFileLowering(); 191 return TLOF->getContext().getOrCreateSymbol(NameStr); 192 } 193