Line data Source code
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 40965 : void LLVMTargetMachine::initAsmInfo() {
43 81930 : MRI.reset(TheTarget.createMCRegInfo(getTargetTriple().str()));
44 40965 : 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 81930 : STI.reset(TheTarget.createMCSubtargetInfo(
50 : getTargetTriple().str(), getTargetCPU(), getTargetFeatureString()));
51 :
52 : MCAsmInfo *TmpAsmInfo =
53 81930 : 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 40965 : if (Options.DisableIntegratedAS)
63 186 : TmpAsmInfo->setUseIntegratedAssembler(false);
64 :
65 40965 : TmpAsmInfo->setPreserveAsmComments(Options.MCOptions.PreserveAsmComments);
66 :
67 40965 : TmpAsmInfo->setCompressDebugSections(Options.CompressDebugSections);
68 :
69 40965 : TmpAsmInfo->setRelaxELFRelocations(Options.RelaxELFRelocations);
70 :
71 40965 : if (Options.ExceptionModel != ExceptionHandling::None)
72 : TmpAsmInfo->setExceptionsType(Options.ExceptionModel);
73 :
74 : AsmInfo.reset(TmpAsmInfo);
75 40965 : }
76 :
77 40979 : 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 40979 : CodeGenOpt::Level OL)
83 40979 : : TargetMachine(T, DataLayoutString, TT, CPU, FS, Options) {
84 40979 : this->RM = RM;
85 40979 : this->CMModel = CM;
86 40979 : this->OptLevel = OL;
87 :
88 40979 : if (EnableTrapUnreachable)
89 2 : this->Options.TrapUnreachable = true;
90 40979 : }
91 :
92 : TargetTransformInfo
93 9520 : LLVMTargetMachine::getTargetTransformInfo(const Function &F) {
94 9520 : return TargetTransformInfo(BasicTTIImpl(this, F));
95 : }
96 :
97 : /// addPassesToX helper drives creation and initialization of TargetPassConfig.
98 : static MCContext *
99 27459 : addPassesToGenerateCode(LLVMTargetMachine *TM, PassManagerBase &PM,
100 : bool DisableVerify, bool &WillCompleteCodeGenPipeline,
101 : raw_pwrite_stream &Out, MachineModuleInfo *MMI) {
102 : // Targets may override createPassConfig to provide a target-specific
103 : // subclass.
104 27459 : TargetPassConfig *PassConfig = TM->createPassConfig(PM);
105 : // Set PassConfig options provided by TargetMachine.
106 27453 : PassConfig->setDisableVerify(DisableVerify);
107 27453 : WillCompleteCodeGenPipeline = PassConfig->willCompleteCodeGenPipeline();
108 27453 : PM.add(PassConfig);
109 27453 : if (!MMI)
110 7282 : MMI = new MachineModuleInfo(TM);
111 27453 : PM.add(MMI);
112 :
113 27453 : if (PassConfig->addISelPasses())
114 : return nullptr;
115 27453 : PassConfig->addMachinePasses();
116 : PassConfig->setInitialized();
117 27453 : if (!WillCompleteCodeGenPipeline)
118 196 : PM.add(createPrintMIRPass(Out));
119 :
120 27453 : return &MMI->getContext();
121 : }
122 :
123 26981 : bool LLVMTargetMachine::addAsmPrinter(PassManagerBase &PM,
124 : raw_pwrite_stream &Out,
125 : raw_pwrite_stream *DwoOut,
126 : CodeGenFileType FileType,
127 : MCContext &Context) {
128 26981 : if (Options.MCOptions.MCSaveTempLabels)
129 : Context.setAllowTemporaryLabels(false);
130 :
131 : const MCSubtargetInfo &STI = *getMCSubtargetInfo();
132 : const MCAsmInfo &MAI = *getMCAsmInfo();
133 : const MCRegisterInfo &MRI = *getMCRegisterInfo();
134 : const MCInstrInfo &MII = *getMCInstrInfo();
135 :
136 26981 : std::unique_ptr<MCStreamer> AsmStreamer;
137 :
138 26981 : switch (FileType) {
139 19106 : case CGFT_AssemblyFile: {
140 38212 : MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter(
141 : getTargetTriple(), MAI.getAssemblerDialect(), MAI, MII, MRI);
142 :
143 : // Create a code emitter if asked to show the encoding.
144 19106 : std::unique_ptr<MCCodeEmitter> MCE;
145 19106 : if (Options.MCOptions.ShowMCEncoding)
146 383 : MCE.reset(getTarget().createMCCodeEmitter(MII, MRI, Context));
147 :
148 : std::unique_ptr<MCAsmBackend> MAB(
149 19106 : getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions));
150 19106 : auto FOut = llvm::make_unique<formatted_raw_ostream>(Out);
151 38212 : MCStreamer *S = getTarget().createAsmStreamer(
152 19106 : Context, std::move(FOut), Options.MCOptions.AsmVerbose,
153 19106 : Options.MCOptions.MCUseDwarfDirectory, InstPrinter, std::move(MCE),
154 19106 : std::move(MAB), Options.MCOptions.ShowMCInst);
155 : AsmStreamer.reset(S);
156 : break;
157 : }
158 7862 : case CGFT_ObjectFile: {
159 : // Create the code emitter for the target if it exists. If not, .o file
160 : // emission fails.
161 7862 : MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(MII, MRI, Context);
162 : MCAsmBackend *MAB =
163 7862 : getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions);
164 7862 : if (!MCE || !MAB)
165 0 : return true;
166 :
167 : // Don't waste memory on names of temp labels.
168 : Context.setUseNamesOnTempLabels(false);
169 :
170 7862 : Triple T(getTargetTriple().str());
171 7862 : AsmStreamer.reset(getTarget().createMCObjectStreamer(
172 7862 : T, Context, std::unique_ptr<MCAsmBackend>(MAB),
173 15724 : DwoOut ? MAB->createDwoObjectWriter(Out, *DwoOut)
174 : : MAB->createObjectWriter(Out),
175 7862 : std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll,
176 7862 : Options.MCOptions.MCIncrementalLinkerCompatible,
177 : /*DWARFMustBeAtTheEnd*/ true));
178 : break;
179 : }
180 13 : case CGFT_Null:
181 : // The Null output is intended for use for performance analysis and testing,
182 : // not real users.
183 13 : AsmStreamer.reset(getTarget().createNullStreamer(Context));
184 : break;
185 : }
186 :
187 : // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
188 : FunctionPass *Printer =
189 26981 : getTarget().createAsmPrinter(*this, std::move(AsmStreamer));
190 26981 : if (!Printer)
191 0 : return true;
192 :
193 26981 : PM.add(Printer);
194 26981 : return false;
195 : }
196 :
197 27183 : bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
198 : raw_pwrite_stream &Out,
199 : raw_pwrite_stream *DwoOut,
200 : CodeGenFileType FileType,
201 : bool DisableVerify,
202 : MachineModuleInfo *MMI) {
203 : // Add common CodeGen passes.
204 27183 : bool WillCompleteCodeGenPipeline = true;
205 27183 : MCContext *Context = addPassesToGenerateCode(
206 : this, PM, DisableVerify, WillCompleteCodeGenPipeline, Out, MMI);
207 27177 : if (!Context)
208 : return true;
209 :
210 54158 : if (WillCompleteCodeGenPipeline &&
211 26981 : addAsmPrinter(PM, Out, DwoOut, FileType, *Context))
212 : return true;
213 :
214 27177 : PM.add(createFreeMachineFunctionPass());
215 27177 : return false;
216 : }
217 :
218 : /// addPassesToEmitMC - Add passes to the specified pass manager to get
219 : /// machine code emitted with the MCJIT. This method returns true if machine
220 : /// code is not supported. It fills the MCContext Ctx pointer which can be
221 : /// used to build custom MCStreamer.
222 : ///
223 276 : bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx,
224 : raw_pwrite_stream &Out,
225 : bool DisableVerify) {
226 : // Add common CodeGen passes.
227 276 : bool WillCompleteCodeGenPipeline = true;
228 276 : Ctx = addPassesToGenerateCode(this, PM, DisableVerify,
229 : WillCompleteCodeGenPipeline, Out,
230 : /*MachineModuleInfo*/ nullptr);
231 276 : if (!Ctx)
232 : return true;
233 : assert(WillCompleteCodeGenPipeline && "CodeGen pipeline has been altered");
234 :
235 276 : if (Options.MCOptions.MCSaveTempLabels)
236 : Ctx->setAllowTemporaryLabels(false);
237 :
238 : // Create the code emitter for the target if it exists. If not, .o file
239 : // emission fails.
240 : const MCSubtargetInfo &STI = *getMCSubtargetInfo();
241 : const MCRegisterInfo &MRI = *getMCRegisterInfo();
242 : MCCodeEmitter *MCE =
243 552 : getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx);
244 : MCAsmBackend *MAB =
245 276 : getTarget().createMCAsmBackend(STI, MRI, Options.MCOptions);
246 276 : if (!MCE || !MAB)
247 : return true;
248 :
249 : const Triple &T = getTargetTriple();
250 276 : std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer(
251 552 : T, *Ctx, std::unique_ptr<MCAsmBackend>(MAB), MAB->createObjectWriter(Out),
252 552 : std::unique_ptr<MCCodeEmitter>(MCE), STI, Options.MCOptions.MCRelaxAll,
253 276 : Options.MCOptions.MCIncrementalLinkerCompatible,
254 276 : /*DWARFMustBeAtTheEnd*/ true));
255 :
256 : // Create the AsmPrinter, which takes ownership of AsmStreamer if successful.
257 : FunctionPass *Printer =
258 276 : getTarget().createAsmPrinter(*this, std::move(AsmStreamer));
259 276 : if (!Printer)
260 0 : return true;
261 :
262 276 : PM.add(Printer);
263 276 : PM.add(createFreeMachineFunctionPass());
264 :
265 276 : return false; // success!
266 : }
|