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(NoFramePointerElim, "no-frame-pointer-elim"); 70 RESET_OPTION(LessPreciseFPMADOption, "less-precise-fpmad"); 71 RESET_OPTION(UnsafeFPMath, "unsafe-fp-math"); 72 RESET_OPTION(NoInfsFPMath, "no-infs-fp-math"); 73 RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math"); 74 RESET_OPTION(DisableTailCalls, "disable-tail-calls"); 75 } 76 77 /// getRelocationModel - Returns the code generation relocation model. The 78 /// choices are static, PIC, and dynamic-no-pic, and target default. 79 Reloc::Model TargetMachine::getRelocationModel() const { 80 if (!CodeGenInfo) 81 return Reloc::Default; 82 return CodeGenInfo->getRelocationModel(); 83 } 84 85 /// getCodeModel - Returns the code model. The choices are small, kernel, 86 /// medium, large, and target default. 87 CodeModel::Model TargetMachine::getCodeModel() const { 88 if (!CodeGenInfo) 89 return CodeModel::Default; 90 return CodeGenInfo->getCodeModel(); 91 } 92 93 /// Get the IR-specified TLS model for Var. 94 static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) { 95 switch (GV->getThreadLocalMode()) { 96 case GlobalVariable::NotThreadLocal: 97 llvm_unreachable("getSelectedTLSModel for non-TLS variable"); 98 break; 99 case GlobalVariable::GeneralDynamicTLSModel: 100 return TLSModel::GeneralDynamic; 101 case GlobalVariable::LocalDynamicTLSModel: 102 return TLSModel::LocalDynamic; 103 case GlobalVariable::InitialExecTLSModel: 104 return TLSModel::InitialExec; 105 case GlobalVariable::LocalExecTLSModel: 106 return TLSModel::LocalExec; 107 } 108 llvm_unreachable("invalid TLS model"); 109 } 110 111 TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { 112 bool isLocal = GV->hasLocalLinkage(); 113 bool isDeclaration = GV->isDeclaration(); 114 bool isPIC = getRelocationModel() == Reloc::PIC_; 115 bool isPIE = Options.PositionIndependentExecutable; 116 // FIXME: what should we do for protected and internal visibility? 117 // For variables, is internal different from hidden? 118 bool isHidden = GV->hasHiddenVisibility(); 119 120 TLSModel::Model Model; 121 if (isPIC && !isPIE) { 122 if (isLocal || isHidden) 123 Model = TLSModel::LocalDynamic; 124 else 125 Model = TLSModel::GeneralDynamic; 126 } else { 127 if (!isDeclaration || isHidden) 128 Model = TLSModel::LocalExec; 129 else 130 Model = TLSModel::InitialExec; 131 } 132 133 // If the user specified a more specific model, use that. 134 TLSModel::Model SelectedModel = getSelectedTLSModel(GV); 135 if (SelectedModel > Model) 136 return SelectedModel; 137 138 return Model; 139 } 140 141 /// getOptLevel - Returns the optimization level: None, Less, 142 /// Default, or Aggressive. 143 CodeGenOpt::Level TargetMachine::getOptLevel() const { 144 if (!CodeGenInfo) 145 return CodeGenOpt::Default; 146 return CodeGenInfo->getOptLevel(); 147 } 148 149 void TargetMachine::setOptLevel(CodeGenOpt::Level Level) const { 150 if (CodeGenInfo) 151 CodeGenInfo->setOptLevel(Level); 152 } 153 154 TargetIRAnalysis TargetMachine::getTargetIRAnalysis() { 155 return TargetIRAnalysis( 156 [this](Function &) { return TargetTransformInfo(getDataLayout()); }); 157 } 158 159 static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo, 160 const MCSection &Section) { 161 if (!AsmInfo.isSectionAtomizableBySymbols(Section)) 162 return true; 163 164 // If it is not dead stripped, it is safe to use private labels. 165 const MCSectionMachO &SMO = cast<MCSectionMachO>(Section); 166 if (SMO.hasAttribute(MachO::S_ATTR_NO_DEAD_STRIP)) 167 return true; 168 169 return false; 170 } 171 172 void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name, 173 const GlobalValue *GV, Mangler &Mang, 174 bool MayAlwaysUsePrivate) const { 175 if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) { 176 // Simple case: If GV is not private, it is not important to find out if 177 // private labels are legal in this case or not. 178 Mang.getNameWithPrefix(Name, GV, false); 179 return; 180 } 181 SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, *this); 182 const TargetLoweringObjectFile *TLOF = getObjFileLowering(); 183 const MCSection *TheSection = TLOF->SectionForGlobal(GV, GVKind, Mang, *this); 184 bool CannotUsePrivateLabel = !canUsePrivateLabel(*AsmInfo, *TheSection); 185 TLOF->getNameWithPrefix(Name, GV, CannotUsePrivateLabel, Mang, *this); 186 } 187 188 MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const { 189 SmallString<60> NameStr; 190 getNameWithPrefix(NameStr, GV, Mang); 191 const TargetLoweringObjectFile *TLOF = getObjFileLowering(); 192 return TLOF->getContext().getOrCreateSymbol(NameStr); 193 } 194