Home | History | Annotate | Line # | Download | only in Target
      1 //===-- TargetMachine.cpp - General Target Information ---------------------==//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file describes the general parts of a Target machine.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #include "llvm/Target/TargetMachine.h"
     14 #include "llvm/Analysis/TargetTransformInfo.h"
     15 #include "llvm/IR/Function.h"
     16 #include "llvm/IR/GlobalAlias.h"
     17 #include "llvm/IR/GlobalValue.h"
     18 #include "llvm/IR/GlobalVariable.h"
     19 #include "llvm/IR/LegacyPassManager.h"
     20 #include "llvm/IR/Mangler.h"
     21 #include "llvm/MC/MCAsmInfo.h"
     22 #include "llvm/MC/MCContext.h"
     23 #include "llvm/MC/MCInstrInfo.h"
     24 #include "llvm/MC/MCSectionMachO.h"
     25 #include "llvm/MC/MCTargetOptions.h"
     26 #include "llvm/MC/SectionKind.h"
     27 #include "llvm/Target/TargetLoweringObjectFile.h"
     28 using namespace llvm;
     29 
     30 //---------------------------------------------------------------------------
     31 // TargetMachine Class
     32 //
     33 
     34 TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString,
     35                              const Triple &TT, StringRef CPU, StringRef FS,
     36                              const TargetOptions &Options)
     37     : TheTarget(T), DL(DataLayoutString), TargetTriple(TT),
     38       TargetCPU(std::string(CPU)), TargetFS(std::string(FS)), AsmInfo(nullptr),
     39       MRI(nullptr), MII(nullptr), STI(nullptr), RequireStructuredCFG(false),
     40       O0WantsFastISel(false), DefaultOptions(Options), Options(Options) {}
     41 
     42 TargetMachine::~TargetMachine() = default;
     43 
     44 bool TargetMachine::isPositionIndependent() const {
     45   return getRelocationModel() == Reloc::PIC_;
     46 }
     47 
     48 /// Reset the target options based on the function's attributes.
     49 /// setFunctionAttributes should have made the raw attribute value consistent
     50 /// with the command line flag if used.
     51 //
     52 // FIXME: This function needs to go away for a number of reasons:
     53 // a) global state on the TargetMachine is terrible in general,
     54 // b) these target options should be passed only on the function
     55 //    and not on the TargetMachine (via TargetOptions) at all.
     56 void TargetMachine::resetTargetOptions(const Function &F) const {
     57 #define RESET_OPTION(X, Y)                                              \
     58   do {                                                                  \
     59     Options.X = F.getFnAttribute(Y).getValueAsBool();     \
     60   } while (0)
     61 
     62   RESET_OPTION(UnsafeFPMath, "unsafe-fp-math");
     63   RESET_OPTION(NoInfsFPMath, "no-infs-fp-math");
     64   RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math");
     65   RESET_OPTION(NoSignedZerosFPMath, "no-signed-zeros-fp-math");
     66 }
     67 
     68 /// Returns the code generation relocation model. The choices are static, PIC,
     69 /// and dynamic-no-pic.
     70 Reloc::Model TargetMachine::getRelocationModel() const { return RM; }
     71 
     72 /// Returns the code model. The choices are small, kernel, medium, large, and
     73 /// target default.
     74 CodeModel::Model TargetMachine::getCodeModel() const { return CMModel; }
     75 
     76 /// Get the IR-specified TLS model for Var.
     77 static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) {
     78   switch (GV->getThreadLocalMode()) {
     79   case GlobalVariable::NotThreadLocal:
     80     llvm_unreachable("getSelectedTLSModel for non-TLS variable");
     81     break;
     82   case GlobalVariable::GeneralDynamicTLSModel:
     83     return TLSModel::GeneralDynamic;
     84   case GlobalVariable::LocalDynamicTLSModel:
     85     return TLSModel::LocalDynamic;
     86   case GlobalVariable::InitialExecTLSModel:
     87     return TLSModel::InitialExec;
     88   case GlobalVariable::LocalExecTLSModel:
     89     return TLSModel::LocalExec;
     90   }
     91   llvm_unreachable("invalid TLS model");
     92 }
     93 
     94 bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
     95                                          const GlobalValue *GV) const {
     96   const Triple &TT = getTargetTriple();
     97   Reloc::Model RM = getRelocationModel();
     98 
     99   // According to the llvm language reference, we should be able to
    100   // just return false in here if we have a GV, as we know it is
    101   // dso_preemptable.  At this point in time, the various IR producers
    102   // have not been transitioned to always produce a dso_local when it
    103   // is possible to do so.
    104   // In the case of ExternalSymbolSDNode, GV is null and we should just return
    105   // false. However, COFF currently relies on this to be true
    106   //
    107   // As a result we still have some logic in here to improve the quality of the
    108   // generated code.
    109   // FIXME: Add a module level metadata for whether intrinsics should be assumed
    110   // local.
    111   if (!GV)
    112     return TT.isOSBinFormatCOFF();
    113 
    114   // If the IR producer requested that this GV be treated as dso local, obey.
    115   if (GV->isDSOLocal())
    116     return true;
    117 
    118   // DLLImport explicitly marks the GV as external.
    119   if (GV->hasDLLImportStorageClass())
    120     return false;
    121 
    122   // On MinGW, variables that haven't been declared with DLLImport may still
    123   // end up automatically imported by the linker. To make this feasible,
    124   // don't assume the variables to be DSO local unless we actually know
    125   // that for sure. This only has to be done for variables; for functions
    126   // the linker can insert thunks for calling functions from another DLL.
    127   if (TT.isWindowsGNUEnvironment() && TT.isOSBinFormatCOFF() &&
    128       GV->isDeclarationForLinker() && isa<GlobalVariable>(GV))
    129     return false;
    130 
    131   // On COFF, don't mark 'extern_weak' symbols as DSO local. If these symbols
    132   // remain unresolved in the link, they can be resolved to zero, which is
    133   // outside the current DSO.
    134   if (TT.isOSBinFormatCOFF() && GV->hasExternalWeakLinkage())
    135     return false;
    136 
    137   // Every other GV is local on COFF.
    138   // Make an exception for windows OS in the triple: Some firmware builds use
    139   // *-win32-macho triples. This (accidentally?) produced windows relocations
    140   // without GOT tables in older clang versions; Keep this behaviour.
    141   // Some JIT users use *-win32-elf triples; these shouldn't use GOT tables
    142   // either.
    143   if (TT.isOSBinFormatCOFF() || TT.isOSWindows())
    144     return true;
    145 
    146   if (TT.isOSBinFormatMachO()) {
    147     if (RM == Reloc::Static)
    148       return true;
    149     return GV->isStrongDefinitionForLinker();
    150   }
    151 
    152   // Due to the AIX linkage model, any global with default visibility is
    153   // considered non-local.
    154   if (TT.isOSBinFormatXCOFF())
    155     return false;
    156 
    157   assert(TT.isOSBinFormatELF() || TT.isOSBinFormatWasm());
    158   assert(RM != Reloc::DynamicNoPIC);
    159   return false;
    160 }
    161 
    162 bool TargetMachine::useEmulatedTLS() const {
    163   // Returns Options.EmulatedTLS if the -emulated-tls or -no-emulated-tls
    164   // was specified explicitly; otherwise uses target triple to decide default.
    165   if (Options.ExplicitEmulatedTLS)
    166     return Options.EmulatedTLS;
    167   return getTargetTriple().hasDefaultEmulatedTLS();
    168 }
    169 
    170 TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {
    171   bool IsPIE = GV->getParent()->getPIELevel() != PIELevel::Default;
    172   Reloc::Model RM = getRelocationModel();
    173   bool IsSharedLibrary = RM == Reloc::PIC_ && !IsPIE;
    174   bool IsLocal = shouldAssumeDSOLocal(*GV->getParent(), GV);
    175 
    176   TLSModel::Model Model;
    177   if (IsSharedLibrary) {
    178     if (IsLocal)
    179       Model = TLSModel::LocalDynamic;
    180     else
    181       Model = TLSModel::GeneralDynamic;
    182   } else {
    183     if (IsLocal)
    184       Model = TLSModel::LocalExec;
    185     else
    186       Model = TLSModel::InitialExec;
    187   }
    188 
    189   // If the user specified a more specific model, use that.
    190   TLSModel::Model SelectedModel = getSelectedTLSModel(GV);
    191   if (SelectedModel > Model)
    192     return SelectedModel;
    193 
    194   return Model;
    195 }
    196 
    197 /// Returns the optimization level: None, Less, Default, or Aggressive.
    198 CodeGenOpt::Level TargetMachine::getOptLevel() const { return OptLevel; }
    199 
    200 void TargetMachine::setOptLevel(CodeGenOpt::Level Level) { OptLevel = Level; }
    201 
    202 TargetTransformInfo TargetMachine::getTargetTransformInfo(const Function &F) {
    203   return TargetTransformInfo(F.getParent()->getDataLayout());
    204 }
    205 
    206 void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name,
    207                                       const GlobalValue *GV, Mangler &Mang,
    208                                       bool MayAlwaysUsePrivate) const {
    209   if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) {
    210     // Simple case: If GV is not private, it is not important to find out if
    211     // private labels are legal in this case or not.
    212     Mang.getNameWithPrefix(Name, GV, false);
    213     return;
    214   }
    215   const TargetLoweringObjectFile *TLOF = getObjFileLowering();
    216   TLOF->getNameWithPrefix(Name, GV, *this);
    217 }
    218 
    219 MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV) const {
    220   const TargetLoweringObjectFile *TLOF = getObjFileLowering();
    221   // XCOFF symbols could have special naming convention.
    222   if (MCSymbol *TargetSymbol = TLOF->getTargetSymbol(GV, *this))
    223     return TargetSymbol;
    224 
    225   SmallString<128> NameStr;
    226   getNameWithPrefix(NameStr, GV, TLOF->getMangler());
    227   return TLOF->getContext().getOrCreateSymbol(NameStr);
    228 }
    229 
    230 TargetIRAnalysis TargetMachine::getTargetIRAnalysis() {
    231   // Since Analysis can't depend on Target, use a std::function to invert the
    232   // dependency.
    233   return TargetIRAnalysis(
    234       [this](const Function &F) { return this->getTargetTransformInfo(F); });
    235 }
    236 
    237 std::pair<int, int> TargetMachine::parseBinutilsVersion(StringRef Version) {
    238   if (Version == "none")
    239     return {INT_MAX, INT_MAX}; // Make binutilsIsAtLeast() return true.
    240   std::pair<int, int> Ret;
    241   if (!Version.consumeInteger(10, Ret.first) && Version.consume_front("."))
    242     Version.consumeInteger(10, Ret.second);
    243   return Ret;
    244 }
    245