1.1
|
(pascal 03-Sep-16)
| 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/IR/Function.h"
|
|
| 17
|
: #include "llvm/IR/GlobalAlias.h"
|
|
| 18
|
: #include "llvm/IR/GlobalValue.h"
|
|
| 19
|
: #include "llvm/IR/GlobalVariable.h"
|
1.1.1.2
|
(patrick 14-Jan-17)
| 20
|
: #include "llvm/IR/LegacyPassManager.h"
|
1.1
|
(pascal 03-Sep-16)
| 21
|
: #include "llvm/IR/Mangler.h"
|
|
| 22
|
: #include "llvm/MC/MCAsmInfo.h"
|
|
| 23
|
: #include "llvm/MC/MCContext.h"
|
|
| 24
|
: #include "llvm/MC/MCInstrInfo.h"
|
|
| 25
|
: #include "llvm/MC/MCSectionMachO.h"
|
|
| 26
|
: #include "llvm/MC/MCTargetOptions.h"
|
|
| 27
|
: #include "llvm/MC/SectionKind.h"
|
1.1.1.6
|
(patrick 27-Jan-19)
| 28
|
: #include "llvm/Target/TargetLoweringObjectFile.h"
|
1.1
|
(pascal 03-Sep-16)
| 29
|
: using namespace llvm;
|
|
| 30
|
:
|
|
| 31
|
: //---------------------------------------------------------------------------
|
|
| 32
|
: // TargetMachine Class
|
|
| 33
|
: //
|
|
| 34
|
:
|
|
| 35
|
: TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString,
|
|
| 36
|
: const Triple &TT, StringRef CPU, StringRef FS,
|
|
| 37
|
: const TargetOptions &Options)
|
|
| 38
|
: : TheTarget(T), DL(DataLayoutString), TargetTriple(TT), TargetCPU(CPU),
|
1.1.1.2
|
(patrick 14-Jan-17)
| 39
|
: TargetFS(FS), AsmInfo(nullptr), MRI(nullptr), MII(nullptr), STI(nullptr),
|
1.1.1.3
|
(patrick 24-Jan-17)
| 40
|
: RequireStructuredCFG(false), DefaultOptions(Options), Options(Options) {
|
1.1.1.2
|
(patrick 14-Jan-17)
| 41
|
: }
|
1.1
|
(pascal 03-Sep-16)
| 42
|
:
|
1.1.1.7
|
(patrick 23-Jun-19)
| 43
|
: TargetMachine::~TargetMachine() = default;
|
1.1
|
(pascal 03-Sep-16)
| 44
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 45
|
: bool TargetMachine::isPositionIndependent() const {
|
|
| 46
|
: return getRelocationModel() == Reloc::PIC_;
|
|
| 47
|
: }
|
|
| 48
|
:
|
1.1.1.6
|
(patrick 27-Jan-19)
| 49
|
: /// Reset the target options based on the function's attributes.
|
1.1
|
(pascal 03-Sep-16)
| 50
|
: // FIXME: This function needs to go away for a number of reasons:
|
|
| 51
|
: // a) global state on the TargetMachine is terrible in general,
|
1.1.1.3
|
(patrick 24-Jan-17)
| 52
|
: // b) these target options should be passed only on the function
|
1.1
|
(pascal 03-Sep-16)
| 53
|
: // and not on the TargetMachine (via TargetOptions) at all.
|
|
| 54
|
: void TargetMachine::resetTargetOptions(const Function &F) const {
|
|
| 55
|
: #define RESET_OPTION(X, Y) \
|
|
| 56
|
: do { \
|
|
| 57
|
: if (F.hasFnAttribute(Y)) \
|
|
| 58
|
: Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \
|
1.1.1.3
|
(patrick 24-Jan-17)
| 59
|
: else \
|
|
| 60
|
: Options.X = DefaultOptions.X; \
|
1.1
|
(pascal 03-Sep-16)
| 61
|
: } while (0)
|
|
| 62
|
:
|
|
| 63
|
: RESET_OPTION(UnsafeFPMath, "unsafe-fp-math");
|
|
| 64
|
: RESET_OPTION(NoInfsFPMath, "no-infs-fp-math");
|
|
| 65
|
: RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math");
|
1.1.1.4
|
(patrick 04-Oct-17)
| 66
|
: RESET_OPTION(NoSignedZerosFPMath, "no-signed-zeros-fp-math");
|
1.1.1.3
|
(patrick 24-Jan-17)
| 67
|
: RESET_OPTION(NoTrappingFPMath, "no-trapping-math");
|
|
| 68
|
:
|
|
| 69
|
: StringRef Denormal =
|
|
| 70
|
: F.getFnAttribute("denormal-fp-math").getValueAsString();
|
|
| 71
|
: if (Denormal == "ieee")
|
|
| 72
|
: Options.FPDenormalMode = FPDenormal::IEEE;
|
|
| 73
|
: else if (Denormal == "preserve-sign")
|
|
| 74
|
: Options.FPDenormalMode = FPDenormal::PreserveSign;
|
|
| 75
|
: else if (Denormal == "positive-zero")
|
|
| 76
|
: Options.FPDenormalMode = FPDenormal::PositiveZero;
|
|
| 77
|
: else
|
|
| 78
|
: Options.FPDenormalMode = DefaultOptions.FPDenormalMode;
|
1.1
|
(pascal 03-Sep-16)
| 79
|
: }
|
|
| 80
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 81
|
: /// Returns the code generation relocation model. The choices are static, PIC,
|
|
| 82
|
: /// and dynamic-no-pic.
|
|
| 83
|
: Reloc::Model TargetMachine::getRelocationModel() const { return RM; }
|
|
| 84
|
:
|
|
| 85
|
: /// Returns the code model. The choices are small, kernel, medium, large, and
|
|
| 86
|
: /// target default.
|
|
| 87
|
: CodeModel::Model TargetMachine::getCodeModel() const { return CMModel; }
|
1.1
|
(pascal 03-Sep-16)
| 88
|
:
|
|
| 89
|
: /// Get the IR-specified TLS model for Var.
|
|
| 90
|
: static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) {
|
|
| 91
|
: switch (GV->getThreadLocalMode()) {
|
|
| 92
|
: case GlobalVariable::NotThreadLocal:
|
|
| 93
|
: llvm_unreachable("getSelectedTLSModel for non-TLS variable");
|
|
| 94
|
: break;
|
|
| 95
|
: case GlobalVariable::GeneralDynamicTLSModel:
|
|
| 96
|
: return TLSModel::GeneralDynamic;
|
|
| 97
|
: case GlobalVariable::LocalDynamicTLSModel:
|
|
| 98
|
: return TLSModel::LocalDynamic;
|
|
| 99
|
: case GlobalVariable::InitialExecTLSModel:
|
|
| 100
|
: return TLSModel::InitialExec;
|
|
| 101
|
: case GlobalVariable::LocalExecTLSModel:
|
|
| 102
|
: return TLSModel::LocalExec;
|
|
| 103
|
: }
|
|
| 104
|
: llvm_unreachable("invalid TLS model");
|
|
| 105
|
: }
|
|
| 106
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 107
|
: bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
|
|
| 108
|
: const GlobalValue *GV) const {
|
1.1.1.5
|
(patrick 06-Apr-18)
| 109
|
: // If the IR producer requested that this GV be treated as dso local, obey.
|
|
| 110
|
: if (GV && GV->isDSOLocal())
|
|
| 111
|
: return true;
|
|
| 112
|
:
|
1.1.1.6
|
(patrick 27-Jan-19)
| 113
|
: // If we are not supossed to use a PLT, we cannot assume that intrinsics are
|
|
| 114
|
: // local since the linker can convert some direct access to access via plt.
|
|
| 115
|
: if (M.getRtLibUseGOT() && !GV)
|
|
| 116
|
: return false;
|
|
| 117
|
:
|
|
| 118
|
: // According to the llvm language reference, we should be able to
|
|
| 119
|
: // just return false in here if we have a GV, as we know it is
|
|
| 120
|
: // dso_preemptable. At this point in time, the various IR producers
|
|
| 121
|
: // have not been transitioned to always produce a dso_local when it
|
|
| 122
|
: // is possible to do so.
|
|
| 123
|
: // In the case of intrinsics, GV is null and there is nowhere to put
|
|
| 124
|
: // dso_local. Returning false for those will produce worse code in some
|
|
| 125
|
: // architectures. For example, on x86 the caller has to set ebx before calling
|
|
| 126
|
: // a plt.
|
|
| 127
|
: // As a result we still have some logic in here to improve the quality of the
|
|
| 128
|
: // generated code.
|
|
| 129
|
: // FIXME: Add a module level metadata for whether intrinsics should be assumed
|
|
| 130
|
: // local.
|
1.1.1.5
|
(patrick 06-Apr-18)
| 131
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 132
|
: Reloc::Model RM = getRelocationModel();
|
|
| 133
|
: const Triple &TT = getTargetTriple();
|
|
| 134
|
:
|
|
| 135
|
: // DLLImport explicitly marks the GV as external.
|
|
| 136
|
: if (GV && GV->hasDLLImportStorageClass())
|
1.1.1.7
|
(patrick 23-Jun-19)
| 137
|
: return false;
|
|
| 138
|
:
|
|
| 139
|
: // On MinGW, variables that haven't been declared with DLLImport may still
|
|
| 140
|
: // end up automatically imported by the linker. To make this feasible,
|
|
| 141
|
: // don't assume the variables to be DSO local unless we actually know
|
|
| 142
|
: // that for sure. This only has to be done for variables; for functions
|
|
| 143
|
: // the linker can insert thunks for calling functions from another DLL.
|
|
| 144
|
: if (TT.isWindowsGNUEnvironment() && GV && GV->isDeclarationForLinker() &&
|
|
| 145
|
: isa<GlobalVariable>(GV))
|
1.1.1.2
|
(patrick 14-Jan-17)
| 146
|
: return false;
|
|
| 147
|
:
|
1.1.1.3
|
(patrick 24-Jan-17)
| 148
|
: // Every other GV is local on COFF.
|
1.1.1.6
|
(patrick 27-Jan-19)
| 149
|
: // Make an exception for windows OS in the triple: Some firmware builds use
|
1.1.1.3
|
(patrick 24-Jan-17)
| 150
|
: // *-win32-macho triples. This (accidentally?) produced windows relocations
|
|
| 151
|
: // without GOT tables in older clang versions; Keep this behaviour.
|
|
| 152
|
: if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO()))
|
1.1.1.2
|
(patrick 14-Jan-17)
| 153
|
: return true;
|
|
| 154
|
:
|
1.1.1.5
|
(patrick 06-Apr-18)
| 155
|
: // Most PIC code sequences that assume that a symbol is local cannot
|
|
| 156
|
: // produce a 0 if it turns out the symbol is undefined. While this
|
|
| 157
|
: // is ABI and relocation depended, it seems worth it to handle it
|
|
| 158
|
: // here.
|
1.1.1.6
|
(patrick 27-Jan-19)
| 159
|
: if (GV && isPositionIndependent() && GV->hasExternalWeakLinkage())
|
1.1.1.5
|
(patrick 06-Apr-18)
| 160
|
: return false;
|
|
| 161
|
:
|
1.1.1.6
|
(patrick 27-Jan-19)
| 162
|
: if (GV && !GV->hasDefaultVisibility())
|
1.1.1.2
|
(patrick 14-Jan-17)
| 163
|
: return true;
|
|
| 164
|
:
|
|
| 165
|
: if (TT.isOSBinFormatMachO()) {
|
|
| 166
|
: if (RM == Reloc::Static)
|
|
| 167
|
: return true;
|
|
| 168
|
: return GV && GV->isStrongDefinitionForLinker();
|
|
| 169
|
: }
|
|
| 170
|
:
|
|
| 171
|
: assert(TT.isOSBinFormatELF());
|
|
| 172
|
: assert(RM != Reloc::DynamicNoPIC);
|
|
| 173
|
:
|
|
| 174
|
: bool IsExecutable =
|
|
| 175
|
: RM == Reloc::Static || M.getPIELevel() != PIELevel::Default;
|
|
| 176
|
: if (IsExecutable) {
|
|
| 177
|
: // If the symbol is defined, it cannot be preempted.
|
|
| 178
|
: if (GV && !GV->isDeclarationForLinker())
|
|
| 179
|
: return true;
|
|
| 180
|
:
|
1.1.1.5
|
(patrick 06-Apr-18)
| 181
|
: // A symbol marked nonlazybind should not be accessed with a plt. If the
|
|
| 182
|
: // symbol turns out to be external, the linker will convert a direct
|
|
| 183
|
: // access to an access via the plt, so don't assume it is local.
|
|
| 184
|
: const Function *F = dyn_cast_or_null<Function>(GV);
|
|
| 185
|
: if (F && F->hasFnAttribute(Attribute::NonLazyBind))
|
|
| 186
|
: return false;
|
|
| 187
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 188
|
: bool IsTLS = GV && GV->isThreadLocal();
|
1.1.1.3
|
(patrick 24-Jan-17)
| 189
|
: bool IsAccessViaCopyRelocs =
|
1.1.1.6
|
(patrick 27-Jan-19)
| 190
|
: GV && Options.MCOptions.MCPIECopyRelocations && isa<GlobalVariable>(GV);
|
1.1.1.4
|
(patrick 04-Oct-17)
| 191
|
: Triple::ArchType Arch = TT.getArch();
|
|
| 192
|
: bool IsPPC =
|
|
| 193
|
: Arch == Triple::ppc || Arch == Triple::ppc64 || Arch == Triple::ppc64le;
|
|
| 194
|
: // Check if we can use copy relocations. PowerPC has no copy relocations.
|
|
| 195
|
: if (!IsTLS && !IsPPC && (RM == Reloc::Static || IsAccessViaCopyRelocs))
|
1.1.1.2
|
(patrick 14-Jan-17)
| 196
|
: return true;
|
|
| 197
|
: }
|
|
| 198
|
:
|
|
| 199
|
: // ELF supports preemption of other symbols.
|
|
| 200
|
: return false;
|
1.1.1.6
|
(patrick 27-Jan-19)
| 201
|
: }
|
|
| 202
|
:
|
|
| 203
|
: bool TargetMachine::useEmulatedTLS() const {
|
|
| 204
|
: // Returns Options.EmulatedTLS if the -emulated-tls or -no-emulated-tls
|
|
| 205
|
: // was specified explicitly; otherwise uses target triple to decide default.
|
|
| 206
|
: if (Options.ExplicitEmulatedTLS)
|
|
| 207
|
: return Options.EmulatedTLS;
|
|
| 208
|
: return getTargetTriple().hasDefaultEmulatedTLS();
|
1.1.1.2
|
(patrick 14-Jan-17)
| 209
|
: }
|
|
| 210
|
:
|
1.1
|
(pascal 03-Sep-16)
| 211
|
: TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {
|
1.1.1.2
|
(patrick 14-Jan-17)
| 212
|
: bool IsPIE = GV->getParent()->getPIELevel() != PIELevel::Default;
|
|
| 213
|
: Reloc::Model RM = getRelocationModel();
|
|
| 214
|
: bool IsSharedLibrary = RM == Reloc::PIC_ && !IsPIE;
|
|
| 215
|
: bool IsLocal = shouldAssumeDSOLocal(*GV->getParent(), GV);
|
1.1
|
(pascal 03-Sep-16)
| 216
|
:
|
|
| 217
|
: TLSModel::Model Model;
|
1.1.1.2
|
(patrick 14-Jan-17)
| 218
|
: if (IsSharedLibrary) {
|
|
| 219
|
: if (IsLocal)
|
1.1
|
(pascal 03-Sep-16)
| 220
|
: Model = TLSModel::LocalDynamic;
|
|
| 221
|
: else
|
|
| 222
|
: Model = TLSModel::GeneralDynamic;
|
|
| 223
|
: } else {
|
1.1.1.2
|
(patrick 14-Jan-17)
| 224
|
: if (IsLocal)
|
1.1
|
(pascal 03-Sep-16)
| 225
|
: Model = TLSModel::LocalExec;
|
|
| 226
|
: else
|
|
| 227
|
: Model = TLSModel::InitialExec;
|
|
| 228
|
: }
|
|
| 229
|
:
|
|
| 230
|
: // If the user specified a more specific model, use that.
|
|
| 231
|
: TLSModel::Model SelectedModel = getSelectedTLSModel(GV);
|
|
| 232
|
: if (SelectedModel > Model)
|
|
| 233
|
: return SelectedModel;
|
|
| 234
|
:
|
|
| 235
|
: return Model;
|
|
| 236
|
: }
|
|
| 237
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 238
|
: /// Returns the optimization level: None, Less, Default, or Aggressive.
|
|
| 239
|
: CodeGenOpt::Level TargetMachine::getOptLevel() const { return OptLevel; }
|
1.1
|
(pascal 03-Sep-16)
| 240
|
:
|
1.1.1.2
|
(patrick 14-Jan-17)
| 241
|
: void TargetMachine::setOptLevel(CodeGenOpt::Level Level) { OptLevel = Level; }
|
1.1
|
(pascal 03-Sep-16)
| 242
|
:
|
1.1.1.5
|
(patrick 06-Apr-18)
| 243
|
: TargetTransformInfo TargetMachine::getTargetTransformInfo(const Function &F) {
|
|
| 244
|
: return TargetTransformInfo(F.getParent()->getDataLayout());
|
1.1
|
(pascal 03-Sep-16)
| 245
|
: }
|
|
| 246
|
:
|
|
| 247
|
: void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name,
|
|
| 248
|
: const GlobalValue *GV, Mangler &Mang,
|
|
| 249
|
: bool MayAlwaysUsePrivate) const {
|
|
| 250
|
: if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) {
|
|
| 251
|
: // Simple case: If GV is not private, it is not important to find out if
|
|
| 252
|
: // private labels are legal in this case or not.
|
|
| 253
|
: Mang.getNameWithPrefix(Name, GV, false);
|
|
| 254
|
: return;
|
|
| 255
|
: }
|
|
| 256
|
: const TargetLoweringObjectFile *TLOF = getObjFileLowering();
|
1.1.1.3
|
(patrick 24-Jan-17)
| 257
|
: TLOF->getNameWithPrefix(Name, GV, *this);
|
1.1
|
(pascal 03-Sep-16)
| 258
|
: }
|
|
| 259
|
:
|
1.1.1.3
|
(patrick 24-Jan-17)
| 260
|
: MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV) const {
|
1.1
|
(pascal 03-Sep-16)
| 261
|
: const TargetLoweringObjectFile *TLOF = getObjFileLowering();
|
1.1.1.3
|
(patrick 24-Jan-17)
| 262
|
: SmallString<128> NameStr;
|
|
| 263
|
: getNameWithPrefix(NameStr, GV, TLOF->getMangler());
|
1.1
|
(pascal 03-Sep-16)
| 264
|
: return TLOF->getContext().getOrCreateSymbol(NameStr);
|
1.1.1.5
|
(patrick 06-Apr-18)
| 265
|
: }
|
|
| 266
|
:
|
|
| 267
|
: TargetIRAnalysis TargetMachine::getTargetIRAnalysis() {
|
|
| 268
|
: // Since Analysis can't depend on Target, use a std::function to invert the
|
|
| 269
|
: // dependency.
|
|
| 270
|
: return TargetIRAnalysis(
|
|
| 271
|
: [this](const Function &F) { return this->getTargetTransformInfo(F); });
|
1.1
|
(pascal 03-Sep-16)
| 272
|
: }
|