1 //===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===// 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 implements the LLVMTargetMachine class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Analysis/Passes.h" 15 #include "llvm/CodeGen/AsmPrinter.h" 16 #include "llvm/CodeGen/BasicTTIImpl.h" 17 #include "llvm/CodeGen/MachineModuleInfo.h" 18 #include "llvm/CodeGen/Passes.h" 19 #include "llvm/CodeGen/TargetPassConfig.h" 20 #include "llvm/IR/LegacyPassManager.h" 21 #include "llvm/MC/MCAsmBackend.h" 22 #include "llvm/MC/MCAsmInfo.h" 23 #include "llvm/MC/MCCodeEmitter.h" 24 #include "llvm/MC/MCContext.h" 25 #include "llvm/MC/MCInstrInfo.h" 26 #include "llvm/MC/MCObjectWriter.h" 27 #include "llvm/MC/MCStreamer.h" 28 #include "llvm/MC/MCSubtargetInfo.h" 29 #include "llvm/Support/CommandLine.h" 30 #include "llvm/Support/ErrorHandling.h" 31 #include "llvm/Support/FormattedStream.h" 32 #include "llvm/Support/TargetRegistry.h" 33 #include "llvm/Target/TargetLoweringObjectFile.h" 34 #include "llvm/Target/TargetMachine.h" 35 #include "llvm/Target/TargetOptions.h" 36 using namespace llvm; 37 38 static cl::opt<bool> EnableTrapUnreachable("trap-unreachable", 39 cl::Hidden, cl::ZeroOrMore, cl::init(false), 40 cl::desc("Enable generating trap for unreachable")); 41 42 void LLVMTargetMachine::initAsmInfo() { 43 MRI.reset(TheTarget.createMCRegInfo(getTargetTriple().str())); 44 MII.reset(TheTarget.createMCInstrInfo()); 45 // FIXME: Having an MCSubtargetInfo on the target machine is a hack due 46 // to some backends having subtarget feature dependent module level 47 // code generation. This is similar to the hack in the AsmPrinter for 48 // module level assembly etc. 49 STI.reset(TheTarget.createMCSubtargetInfo( 50 getTargetTriple().str(), getTargetCPU(), getTargetFeatureString())); 51 52 MCAsmInfo *TmpAsmInfo = 53 TheTarget.createMCAsmInfo(*MRI, getTargetTriple().str()); 54 // TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0, 55 // and if the old one gets included then MCAsmInfo will be NULL and 56 // we'll crash later. 57 // Provide the user with a useful error message about what's wrong. 58 assert(TmpAsmInfo && "MCAsmInfo not initialized. " 59 "Make sure you include the correct TargetSelect.h" 60 "and that InitializeAllTargetMCs() is being invoked!"); 61 62 if (Options.DisableIntegratedAS) 63 TmpAsmInfo->setUseIntegratedAssembler(false); 64 65 TmpAsmInfo->setPreserveAsmComments(Options.MCOptions.PreserveAsmComments); 66 67 TmpAsmInfo->setCompressDebugSections(Options.CompressDebugSections); 68 69 TmpAsmInfo->setRelaxELFRelocations(Options.RelaxELFRelocations); 70 71 if (Options.ExceptionModel != ExceptionHandling::None) 72 TmpAsmInfo->setExceptionsType(Options.ExceptionModel); 73 74 AsmInfo.reset(TmpAsmInfo); 75 } 76 77 LLVMTargetMachine::LLVMTargetMachine(const Target &T, 78 StringRef DataLayoutString, 79 const Triple &TT, StringRef CPU, 80 StringRef FS, const TargetOptions &Options, 81 Reloc::Model RM, CodeModel::Model CM, 82 CodeGenOpt::Level OL) 83 : TargetMachine(T, DataLayoutString, TT, CPU, FS, Options) { 84 this->RM = RM; 85 this->CMModel = CM; 86 this->OptLevel = OL; 87 88 if (EnableTrapUnreachable) 89 this->Options.TrapUnreachable = true; 90 } 91 92 TargetTransformInfo 93 LLVMTargetMachine::getTargetTransformInfo(const Function &F) { 94 return TargetTransformInfo(BasicTTIImpl(this, F)); 95 } 96 97 /// addPassesToX helper drives creation and initialization of TargetPassConfig. 98 static TargetPassConfig * 99 addPassesToGenerateCode(LLVMTargetMachine &TM, PassManagerBase &PM, 100 bool DisableVerify, MachineModuleInfo &MMI) { 101 // Targets may override createPassConfig to provide a target-specific 102 // subclass. 103 TargetPassConfig *PassConfig = TM.createPassConfig(PM); 104 // Set PassConfig options provided by TargetMachine. 105 PassConfig->setDisableVerify(DisableVerify); 106 PM.add(PassConfig); 107 PM.add(&MMI); 108 109 if (PassConfig->addISelPasses()) 110 return nullptr; 111 PassConfig->addMachinePasses(); 112 PassConfig->setInitialized(); 113 return PassConfig; 114 } 115 116 bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM, 117 raw_pwrite_stream &Out, 118 raw_pwrite_stream *DwoOut, 119 CodeGenFileType FileType, 120 MCContext &Context) { 121 if (Options.MCOptions.MCSaveTempLabels) 122 Context.setAllowTemporaryLabels(false); 123 124 const MCSubtargetInfo &STI = *getMCSubtargetInfo(); 125 const MCAsmInfo &MAI = *getMCAsmInfo(); 126 const MCRegisterInfo &MRI = *getMCRegisterInfo(); 127 const MCInstrInfo &MII = *getMCInstrInfo(); 128 129 std::unique_ptr<MCStreamer> AsmStreamer; 130 131 switch (FileType) { 132 case CGFT_AssemblyFile: { 133 MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter( 134 getTargetTriple(), MAI.getAssemblerDialect(), MAI, MII, MRI); 135 136 // Create a code emitter if asked to show the encoding. 137 std::unique_ptr<MCCodeEmitter> MCE; 138 if (Options.MCOptions.ShowMCEncoding) 139 MCE.reset(getTarget().createMCCodeEmitter(MII, MRI, Context)); 140 141 std::unique_ptr<MCAsmBackend> MAB( 142 getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions)); 143 auto FOut = llvm::make_unique<formatted_raw_ostream>(Out); 144 MCStreamer *S = getTarget().createAsmStreamer( 145 Context, std::move(FOut), Options.MCOptions.AsmVerbose, 146 Options.MCOptions.MCUseDwarfDirectory, InstPrinter, std::move(MCE), 147 std::move(MAB), Options.MCOptions.ShowMCInst); 148 AsmStreamer.reset(S); 149 break; 150 } 151 case CGFT_ObjectFile: { 152 // Create the code emitter for the target if it exists. If not, .o file 153 // emission fails. 154 MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, Context); 155 MCAsmBackend *MAB = 156 getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions); 157 if (!MCE || !MAB) 158 return true; 159 160 // Don't waste memory on names of temp labels. 161 Context.setUseNamesOnTempLabels(false); 162 163 Triple T(getTargetTriple().str()); 164 AsmStreamer.reset(getTarget().createMCObjectStreamer( 165 T, Context, std::unique_ptr<MCAsmBackend>(MAB), 166 DwoOut ? MAB->createDwoObjectWriter(Out, *DwoOut) 167 : MAB->createObjectWriter(Out), 168 std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll, 169 Options.MCOptions.MCIncrementalLinkerCompatible, 170 /*DWARFMustBeAtTheEnd*/ true)); 171 break; 172 } 173 case CGFT_Null: 174 // The Null output is intended for use for performance analysis and testing, 175 // not real users. 176 AsmStreamer.reset(getTarget().createNullStreamer(Context)); 177 break; 178 } 179 180 // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 181 FunctionPass *Printer = 182 getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); 183 if (!Printer) 184 return true; 185 186 PM.add(Printer); 187 return false; 188 } 189 190 bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM, 191 raw_pwrite_stream &Out, 192 raw_pwrite_stream *DwoOut, 193 CodeGenFileType FileType, 194 bool DisableVerify, 195 MachineModuleInfo *MMI) { 196 // Add common CodeGen passes. 197 if (!MMI) 198 MMI = new MachineModuleInfo(this); 199 TargetPassConfig *PassConfig = 200 addPassesToGenerateCode(*this, PM, DisableVerify, *MMI); 201 if (!PassConfig) 202 return true; 203 204 if (!TargetPassConfig::willCompleteCodeGenPipeline()) { 205 PM.add(createPrintMIRPass(Out)); 206 } else if (addAsmPrinter(PM, Out, DwoOut, FileType, MMI->getContext())) 207 return true; 208 209 PM.add(createFreeMachineFunctionPass()); 210 return false; 211 } 212 213 /// addPassesToEmitMC - Add passes to the specified pass manager to get 214 /// machine code emitted with the MCJIT. This method returns true if machine 215 /// code is not supported. It fills the MCContext Ctx pointer which can be 216 /// used to build custom MCStreamer. 217 /// 218 bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, 219 raw_pwrite_stream &Out, 220 bool DisableVerify) { 221 // Add common CodeGen passes. 222 MachineModuleInfo *MMI = new MachineModuleInfo(this); 223 TargetPassConfig *PassConfig = 224 addPassesToGenerateCode(*this, PM, DisableVerify, *MMI); 225 if (!PassConfig) 226 return true; 227 assert(TargetPassConfig::willCompleteCodeGenPipeline() && 228 "Cannot emit MC with limited codegen pipeline"); 229 230 Ctx = &MMI->getContext(); 231 if (Options.MCOptions.MCSaveTempLabels) 232 Ctx->setAllowTemporaryLabels(false); 233 234 // Create the code emitter for the target if it exists. If not, .o file 235 // emission fails. 236 const MCSubtargetInfo &STI = *getMCSubtargetInfo(); 237 const MCRegisterInfo &MRI = *getMCRegisterInfo(); 238 MCCodeEmitter *MCE = 239 getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx); 240 MCAsmBackend *MAB = 241 getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions); 242 if (!MCE || !MAB) 243 return true; 244 245 const Triple &T = getTargetTriple(); 246 std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer( 247 T, *Ctx, std::unique_ptr<MCAsmBackend>(MAB), MAB->createObjectWriter(Out), 248 std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll, 249 Options.MCOptions.MCIncrementalLinkerCompatible, 250 /*DWARFMustBeAtTheEnd*/ true)); 251 252 // Create the AsmPrinter, which takes ownership of AsmStreamer if successful. 253 FunctionPass *Printer = 254 getTarget().createAsmPrinter(*this, std::move(AsmStreamer)); 255 if (!Printer) 256 return true; 257 258 PM.add(Printer); 259 PM.add(createFreeMachineFunctionPass()); 260 261 return false; // success! 262 } 263