| Chris Lattner | 22a6a90 | 2001-09-14 05:34:53 +0000 | [diff] [blame] | 1 | //===-- TargetMachine.cpp - General Target Information ---------------------==// | 
| Misha Brukman | 10468d8 | 2005-04-21 22:55:34 +0000 | [diff] [blame] | 2 | // | 
| John Criswell | 482202a | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | f3ebc3f | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Misha Brukman | 10468d8 | 2005-04-21 22:55:34 +0000 | [diff] [blame] | 7 | // | 
| John Criswell | 482202a | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | 22a6a90 | 2001-09-14 05:34:53 +0000 | [diff] [blame] | 9 | // | 
|  | 10 | // This file describes the general parts of a Target machine. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
| Vikram S. Adve | 3414e78 | 2001-07-21 12:42:08 +0000 | [diff] [blame] | 13 |  | 
| Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 14 | #include "llvm/Target/TargetMachine.h" | 
| Chandler Carruth | 705b185 | 2015-01-31 03:43:40 +0000 | [diff] [blame] | 15 | #include "llvm/Analysis/TargetTransformInfo.h" | 
| Bill Wendling | 965bd58 | 2013-03-13 22:26:59 +0000 | [diff] [blame] | 16 | #include "llvm/CodeGen/MachineFunction.h" | 
|  | 17 | #include "llvm/IR/Function.h" | 
| Chandler Carruth | 9fb823b | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 18 | #include "llvm/IR/GlobalAlias.h" | 
|  | 19 | #include "llvm/IR/GlobalValue.h" | 
|  | 20 | #include "llvm/IR/GlobalVariable.h" | 
| Mehdi Amini | b550cb1 | 2016-04-18 09:17:29 +0000 | [diff] [blame] | 21 | #include "llvm/IR/LegacyPassManager.h" | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 22 | #include "llvm/IR/Mangler.h" | 
| Chris Lattner | 7b26fce | 2009-08-22 20:48:53 +0000 | [diff] [blame] | 23 | #include "llvm/MC/MCAsmInfo.h" | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 24 | #include "llvm/MC/MCContext.h" | 
| Eric Christopher | 72e23a2 | 2015-03-19 22:36:32 +0000 | [diff] [blame] | 25 | #include "llvm/MC/MCInstrInfo.h" | 
| Lang Hames | 1e923ec | 2015-01-09 18:55:42 +0000 | [diff] [blame] | 26 | #include "llvm/MC/MCSectionMachO.h" | 
| Evgeniy Stepanov | 0a951b7 | 2014-04-23 11:16:03 +0000 | [diff] [blame] | 27 | #include "llvm/MC/MCTargetOptions.h" | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 28 | #include "llvm/MC/SectionKind.h" | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 29 | #include "llvm/Target/TargetLowering.h" | 
|  | 30 | #include "llvm/Target/TargetLoweringObjectFile.h" | 
| Eric Christopher | d913448 | 2014-08-04 21:25:23 +0000 | [diff] [blame] | 31 | #include "llvm/Target/TargetSubtargetInfo.h" | 
| Chris Lattner | 5d23600 | 2003-12-28 21:23:38 +0000 | [diff] [blame] | 32 | using namespace llvm; | 
| Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 33 |  | 
| Mehdi Amini | cfed256 | 2016-07-13 23:39:46 +0000 | [diff] [blame] | 34 | cl::opt<bool> EnableIPRA("enable-ipra", cl::init(false), cl::Hidden, | 
|  | 35 | cl::desc("Enable interprocedural register allocation " | 
|  | 36 | "to reduce load/store at procedure calls.")); | 
|  | 37 |  | 
| Vikram S. Adve | 36d3e03 | 2002-09-16 15:39:26 +0000 | [diff] [blame] | 38 | //--------------------------------------------------------------------------- | 
| Chris Lattner | 5d23600 | 2003-12-28 21:23:38 +0000 | [diff] [blame] | 39 | // TargetMachine Class | 
|  | 40 | // | 
| Misha Brukman | 3decf86 | 2004-08-10 23:10:25 +0000 | [diff] [blame] | 41 |  | 
| Mehdi Amini | 93e1ea1 | 2015-03-12 00:07:24 +0000 | [diff] [blame] | 42 | TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString, | 
| Daniel Sanders | 3e5de88 | 2015-06-11 19:41:26 +0000 | [diff] [blame] | 43 | const Triple &TT, StringRef CPU, StringRef FS, | 
| Nick Lewycky | 50f02cb | 2011-12-02 22:16:29 +0000 | [diff] [blame] | 44 | const TargetOptions &Options) | 
| Mehdi Amini | 93e1ea1 | 2015-03-12 00:07:24 +0000 | [diff] [blame] | 45 | : TheTarget(T), DL(DataLayoutString), TargetTriple(TT), TargetCPU(CPU), | 
| Rafael Espindola | d86e8bb | 2016-06-30 18:25:11 +0000 | [diff] [blame] | 46 | TargetFS(FS), AsmInfo(nullptr), MRI(nullptr), MII(nullptr), STI(nullptr), | 
| Justin Lebar | 7d81813 | 2017-01-10 23:43:04 +0000 | [diff] [blame] | 47 | RequireStructuredCFG(false), DefaultOptions(Options), Options(Options) { | 
| Mehdi Amini | cfed256 | 2016-07-13 23:39:46 +0000 | [diff] [blame] | 48 | if (EnableIPRA.getNumOccurrences()) | 
|  | 49 | this->Options.EnableIPRA = EnableIPRA; | 
|  | 50 | } | 
| Anton Korobeynikov | 77d1943 | 2009-06-08 22:53:56 +0000 | [diff] [blame] | 51 |  | 
| Chris Lattner | 5d23600 | 2003-12-28 21:23:38 +0000 | [diff] [blame] | 52 | TargetMachine::~TargetMachine() { | 
| Jim Laskey | ae92ce8 | 2006-09-07 23:39:26 +0000 | [diff] [blame] | 53 | delete AsmInfo; | 
| Eric Christopher | 72e23a2 | 2015-03-19 22:36:32 +0000 | [diff] [blame] | 54 | delete MRI; | 
|  | 55 | delete MII; | 
| Eric Christopher | 12cf76f | 2015-03-19 22:36:37 +0000 | [diff] [blame] | 56 | delete STI; | 
| Chris Lattner | 5d23600 | 2003-12-28 21:23:38 +0000 | [diff] [blame] | 57 | } | 
|  | 58 |  | 
| Rafael Espindola | f9e348b | 2016-06-27 21:33:08 +0000 | [diff] [blame] | 59 | bool TargetMachine::isPositionIndependent() const { | 
|  | 60 | return getRelocationModel() == Reloc::PIC_; | 
|  | 61 | } | 
|  | 62 |  | 
| Bill Wendling | 965bd58 | 2013-03-13 22:26:59 +0000 | [diff] [blame] | 63 | /// \brief Reset the target options based on the function's attributes. | 
| Eric Christopher | 35a8a62 | 2015-04-28 18:09:05 +0000 | [diff] [blame] | 64 | // FIXME: This function needs to go away for a number of reasons: | 
|  | 65 | // a) global state on the TargetMachine is terrible in general, | 
| Justin Lebar | 7d81813 | 2017-01-10 23:43:04 +0000 | [diff] [blame] | 66 | // b) these target options should be passed only on the function | 
| Eric Christopher | 35a8a62 | 2015-04-28 18:09:05 +0000 | [diff] [blame] | 67 | //    and not on the TargetMachine (via TargetOptions) at all. | 
| Eric Christopher | 3976f78 | 2014-09-26 01:28:10 +0000 | [diff] [blame] | 68 | void TargetMachine::resetTargetOptions(const Function &F) const { | 
|  | 69 | #define RESET_OPTION(X, Y)                                                     \ | 
|  | 70 | do {                                                                         \ | 
| Duncan P. N. Exon Smith | 025c0ad | 2015-02-14 15:36:52 +0000 | [diff] [blame] | 71 | if (F.hasFnAttribute(Y))                                                   \ | 
|  | 72 | Options.X = (F.getFnAttribute(Y).getValueAsString() == "true");          \ | 
| Justin Lebar | 7d81813 | 2017-01-10 23:43:04 +0000 | [diff] [blame] | 73 | else                                                                       \ | 
|  | 74 | Options.X = DefaultOptions.X;                                            \ | 
| Bill Wendling | 965bd58 | 2013-03-13 22:26:59 +0000 | [diff] [blame] | 75 | } while (0) | 
|  | 76 |  | 
| Bill Wendling | 965bd58 | 2013-03-13 22:26:59 +0000 | [diff] [blame] | 77 | RESET_OPTION(UnsafeFPMath, "unsafe-fp-math"); | 
|  | 78 | RESET_OPTION(NoInfsFPMath, "no-infs-fp-math"); | 
|  | 79 | RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math"); | 
| Matt Arsenault | 732a531 | 2017-01-25 06:08:42 +0000 | [diff] [blame] | 80 | RESET_OPTION(NoSignedZerosFPMath, "no-signed-zeros-fp-math"); | 
| Sjoerd Meijer | 46b5b88 | 2016-08-31 14:17:38 +0000 | [diff] [blame] | 81 | RESET_OPTION(NoTrappingFPMath, "no-trapping-math"); | 
|  | 82 |  | 
|  | 83 | StringRef Denormal = | 
|  | 84 | F.getFnAttribute("denormal-fp-math").getValueAsString(); | 
|  | 85 | if (Denormal == "ieee") | 
| Sjoerd Meijer | 535529b | 2016-10-04 08:03:36 +0000 | [diff] [blame] | 86 | Options.FPDenormalMode = FPDenormal::IEEE; | 
| Sjoerd Meijer | 46b5b88 | 2016-08-31 14:17:38 +0000 | [diff] [blame] | 87 | else if (Denormal == "preserve-sign") | 
| Sjoerd Meijer | 535529b | 2016-10-04 08:03:36 +0000 | [diff] [blame] | 88 | Options.FPDenormalMode = FPDenormal::PreserveSign; | 
| Sjoerd Meijer | 46b5b88 | 2016-08-31 14:17:38 +0000 | [diff] [blame] | 89 | else if (Denormal == "positive-zero") | 
| Sjoerd Meijer | 535529b | 2016-10-04 08:03:36 +0000 | [diff] [blame] | 90 | Options.FPDenormalMode = FPDenormal::PositiveZero; | 
| Justin Lebar | 7d81813 | 2017-01-10 23:43:04 +0000 | [diff] [blame] | 91 | else | 
|  | 92 | Options.FPDenormalMode = DefaultOptions.FPDenormalMode; | 
| Bill Wendling | 965bd58 | 2013-03-13 22:26:59 +0000 | [diff] [blame] | 93 | } | 
|  | 94 |  | 
| Rafael Espindola | 38af4d6 | 2016-05-18 16:00:24 +0000 | [diff] [blame] | 95 | /// Returns the code generation relocation model. The choices are static, PIC, | 
| Rafael Espindola | 8c34dd8 | 2016-05-18 22:04:49 +0000 | [diff] [blame] | 96 | /// and dynamic-no-pic. | 
| Rafael Espindola | d86e8bb | 2016-06-30 18:25:11 +0000 | [diff] [blame] | 97 | Reloc::Model TargetMachine::getRelocationModel() const { return RM; } | 
| Evan Cheng | ac4f66f | 2006-05-23 18:18:46 +0000 | [diff] [blame] | 98 |  | 
| Rafael Espindola | 222a9d0 | 2016-06-30 12:44:52 +0000 | [diff] [blame] | 99 | /// Returns the code model. The choices are small, kernel, medium, large, and | 
|  | 100 | /// target default. | 
| Rafael Espindola | d86e8bb | 2016-06-30 18:25:11 +0000 | [diff] [blame] | 101 | CodeModel::Model TargetMachine::getCodeModel() const { return CMModel; } | 
| Evan Cheng | 0441746 | 2006-07-06 01:53:36 +0000 | [diff] [blame] | 102 |  | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 103 | /// Get the IR-specified TLS model for Var. | 
| Rafael Espindola | 59f7eba | 2014-05-28 18:15:43 +0000 | [diff] [blame] | 104 | static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) { | 
|  | 105 | switch (GV->getThreadLocalMode()) { | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 106 | case GlobalVariable::NotThreadLocal: | 
|  | 107 | llvm_unreachable("getSelectedTLSModel for non-TLS variable"); | 
|  | 108 | break; | 
|  | 109 | case GlobalVariable::GeneralDynamicTLSModel: | 
|  | 110 | return TLSModel::GeneralDynamic; | 
|  | 111 | case GlobalVariable::LocalDynamicTLSModel: | 
|  | 112 | return TLSModel::LocalDynamic; | 
|  | 113 | case GlobalVariable::InitialExecTLSModel: | 
|  | 114 | return TLSModel::InitialExec; | 
|  | 115 | case GlobalVariable::LocalExecTLSModel: | 
|  | 116 | return TLSModel::LocalExec; | 
|  | 117 | } | 
|  | 118 | llvm_unreachable("invalid TLS model"); | 
|  | 119 | } | 
|  | 120 |  | 
| Rafael Espindola | 3beef8d | 2016-06-27 23:15:57 +0000 | [diff] [blame] | 121 | bool TargetMachine::shouldAssumeDSOLocal(const Module &M, | 
|  | 122 | const GlobalValue *GV) const { | 
|  | 123 | Reloc::Model RM = getRelocationModel(); | 
|  | 124 | const Triple &TT = getTargetTriple(); | 
|  | 125 |  | 
|  | 126 | // DLLImport explicitly marks the GV as external. | 
|  | 127 | if (GV && GV->hasDLLImportStorageClass()) | 
|  | 128 | return false; | 
|  | 129 |  | 
| Matthias Braun | eccdee9 | 2016-10-03 20:11:24 +0000 | [diff] [blame] | 130 | // Every other GV is local on COFF. | 
|  | 131 | // Make an exception for windows OS in the triple: Some firmwares builds use | 
|  | 132 | // *-win32-macho triples. This (accidentally?) produced windows relocations | 
|  | 133 | // without GOT tables in older clang versions; Keep this behaviour. | 
| Matthias Braun | 9baa3e8 | 2016-10-03 22:12:37 +0000 | [diff] [blame] | 134 | if (TT.isOSBinFormatCOFF() || (TT.isOSWindows() && TT.isOSBinFormatMachO())) | 
| Rafael Espindola | 3beef8d | 2016-06-27 23:15:57 +0000 | [diff] [blame] | 135 | return true; | 
|  | 136 |  | 
|  | 137 | if (GV && (GV->hasLocalLinkage() || !GV->hasDefaultVisibility())) | 
|  | 138 | return true; | 
|  | 139 |  | 
|  | 140 | if (TT.isOSBinFormatMachO()) { | 
|  | 141 | if (RM == Reloc::Static) | 
|  | 142 | return true; | 
|  | 143 | return GV && GV->isStrongDefinitionForLinker(); | 
|  | 144 | } | 
|  | 145 |  | 
|  | 146 | assert(TT.isOSBinFormatELF()); | 
|  | 147 | assert(RM != Reloc::DynamicNoPIC); | 
|  | 148 |  | 
|  | 149 | bool IsExecutable = | 
|  | 150 | RM == Reloc::Static || M.getPIELevel() != PIELevel::Default; | 
|  | 151 | if (IsExecutable) { | 
|  | 152 | // If the symbol is defined, it cannot be preempted. | 
|  | 153 | if (GV && !GV->isDeclarationForLinker()) | 
|  | 154 | return true; | 
|  | 155 |  | 
|  | 156 | bool IsTLS = GV && GV->isThreadLocal(); | 
| Sriraman Tallam | f29fa58 | 2016-10-13 20:54:39 +0000 | [diff] [blame] | 157 | bool IsAccessViaCopyRelocs = | 
|  | 158 | Options.MCOptions.MCPIECopyRelocations && GV && isa<GlobalVariable>(GV); | 
| Rafael Espindola | 82149a1 | 2017-01-26 15:02:31 +0000 | [diff] [blame] | 159 | Triple::ArchType Arch = TT.getArch(); | 
|  | 160 | bool IsPPC = | 
|  | 161 | Arch == Triple::ppc || Arch == Triple::ppc64 || Arch == Triple::ppc64le; | 
|  | 162 | // Check if we can use copy relocations. PowerPC has no copy relocations. | 
|  | 163 | if (!IsTLS && !IsPPC && (RM == Reloc::Static || IsAccessViaCopyRelocs)) | 
| Rafael Espindola | 3beef8d | 2016-06-27 23:15:57 +0000 | [diff] [blame] | 164 | return true; | 
|  | 165 | } | 
|  | 166 |  | 
|  | 167 | // ELF supports preemption of other symbols. | 
|  | 168 | return false; | 
|  | 169 | } | 
|  | 170 |  | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 171 | TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { | 
| Rafael Espindola | 8121bec | 2016-06-27 20:19:14 +0000 | [diff] [blame] | 172 | bool IsPIE = GV->getParent()->getPIELevel() != PIELevel::Default; | 
|  | 173 | Reloc::Model RM = getRelocationModel(); | 
|  | 174 | bool IsSharedLibrary = RM == Reloc::PIC_ && !IsPIE; | 
| Rafael Espindola | 3beef8d | 2016-06-27 23:15:57 +0000 | [diff] [blame] | 175 | bool IsLocal = shouldAssumeDSOLocal(*GV->getParent(), GV); | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 176 |  | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 177 | TLSModel::Model Model; | 
| Rafael Espindola | 8121bec | 2016-06-27 20:19:14 +0000 | [diff] [blame] | 178 | if (IsSharedLibrary) { | 
|  | 179 | if (IsLocal) | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 180 | Model = TLSModel::LocalDynamic; | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 181 | else | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 182 | Model = TLSModel::GeneralDynamic; | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 183 | } else { | 
| Rafael Espindola | 8121bec | 2016-06-27 20:19:14 +0000 | [diff] [blame] | 184 | if (IsLocal) | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 185 | Model = TLSModel::LocalExec; | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 186 | else | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 187 | Model = TLSModel::InitialExec; | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 188 | } | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 189 |  | 
| Rafael Espindola | 59f7eba | 2014-05-28 18:15:43 +0000 | [diff] [blame] | 190 | // If the user specified a more specific model, use that. | 
|  | 191 | TLSModel::Model SelectedModel = getSelectedTLSModel(GV); | 
|  | 192 | if (SelectedModel > Model) | 
|  | 193 | return SelectedModel; | 
| Hans Wennborg | cbe34b4 | 2012-06-23 11:37:03 +0000 | [diff] [blame] | 194 |  | 
|  | 195 | return Model; | 
| Chandler Carruth | 16f0ebc | 2012-04-08 17:20:55 +0000 | [diff] [blame] | 196 | } | 
|  | 197 |  | 
| Rafael Espindola | 222a9d0 | 2016-06-30 12:44:52 +0000 | [diff] [blame] | 198 | /// Returns the optimization level: None, Less, Default, or Aggressive. | 
| Rafael Espindola | d86e8bb | 2016-06-30 18:25:11 +0000 | [diff] [blame] | 199 | CodeGenOpt::Level TargetMachine::getOptLevel() const { return OptLevel; } | 
| Evan Cheng | ecb2908 | 2011-11-16 08:38:26 +0000 | [diff] [blame] | 200 |  | 
| Rafael Espindola | d86e8bb | 2016-06-30 18:25:11 +0000 | [diff] [blame] | 201 | void TargetMachine::setOptLevel(CodeGenOpt::Level Level) { OptLevel = Level; } | 
| Paul Robinson | d89125a | 2013-11-22 19:11:24 +0000 | [diff] [blame] | 202 |  | 
| Chandler Carruth | e038552 | 2015-02-01 10:11:22 +0000 | [diff] [blame] | 203 | TargetIRAnalysis TargetMachine::getTargetIRAnalysis() { | 
| Malcolm Parsons | 17d266b | 2017-01-13 17:12:16 +0000 | [diff] [blame] | 204 | return TargetIRAnalysis([](const Function &F) { | 
| Mehdi Amini | 5010ebf | 2015-07-09 02:08:42 +0000 | [diff] [blame] | 205 | return TargetTransformInfo(F.getParent()->getDataLayout()); | 
|  | 206 | }); | 
| Chandler Carruth | 705b185 | 2015-01-31 03:43:40 +0000 | [diff] [blame] | 207 | } | 
|  | 208 |  | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 209 | void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name, | 
| Eric Christopher | c4636b3 | 2016-09-20 22:03:28 +0000 | [diff] [blame] | 210 | const GlobalValue *GV, Mangler &Mang, | 
|  | 211 | bool MayAlwaysUsePrivate) const { | 
| Eric Christopher | c39f8b0 | 2016-10-14 17:28:23 +0000 | [diff] [blame] | 212 | if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) { | 
|  | 213 | // Simple case: If GV is not private, it is not important to find out if | 
|  | 214 | // private labels are legal in this case or not. | 
|  | 215 | Mang.getNameWithPrefix(Name, GV, false); | 
|  | 216 | return; | 
|  | 217 | } | 
| Eric Christopher | c4636b3 | 2016-09-20 22:03:28 +0000 | [diff] [blame] | 218 | const TargetLoweringObjectFile *TLOF = getObjFileLowering(); | 
|  | 219 | TLOF->getNameWithPrefix(Name, GV, *this); | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 220 | } | 
|  | 221 |  | 
| Tim Northover | b64fb45 | 2016-11-22 16:17:20 +0000 | [diff] [blame] | 222 | MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV) const { | 
| Eric Christopher | 36fe028 | 2015-02-03 07:22:52 +0000 | [diff] [blame] | 223 | const TargetLoweringObjectFile *TLOF = getObjFileLowering(); | 
| Tim Northover | b64fb45 | 2016-11-22 16:17:20 +0000 | [diff] [blame] | 224 | SmallString<128> NameStr; | 
|  | 225 | getNameWithPrefix(NameStr, GV, TLOF->getMangler()); | 
| Jim Grosbach | 6f48200 | 2015-05-18 18:43:14 +0000 | [diff] [blame] | 226 | return TLOF->getContext().getOrCreateSymbol(NameStr); | 
| Rafael Espindola | a3ad4e6 | 2014-02-19 20:30:41 +0000 | [diff] [blame] | 227 | } |