Merge branch 'master' into msp430
[llvm/msp430.git] / lib / CodeGen / LLVMTargetMachine.cpp
blobcf16a652fbc817c553b1b8553fa8cb24fe2d2218
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.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Target/TargetMachine.h"
15 #include "llvm/PassManager.h"
16 #include "llvm/Pass.h"
17 #include "llvm/Assembly/PrintModulePass.h"
18 #include "llvm/Analysis/LoopPass.h"
19 #include "llvm/CodeGen/Passes.h"
20 #include "llvm/CodeGen/GCStrategy.h"
21 #include "llvm/Target/TargetOptions.h"
22 #include "llvm/Target/TargetAsmInfo.h"
23 #include "llvm/Transforms/Scalar.h"
24 #include "llvm/Support/CommandLine.h"
25 #include "llvm/Support/raw_ostream.h"
26 using namespace llvm;
28 namespace llvm {
29 bool EnableFastISel;
32 static cl::opt<bool> PrintLSR("print-lsr-output", cl::Hidden,
33 cl::desc("Print LLVM IR produced by the loop-reduce pass"));
34 static cl::opt<bool> PrintISelInput("print-isel-input", cl::Hidden,
35 cl::desc("Print LLVM IR input to isel pass"));
36 static cl::opt<bool> PrintEmittedAsm("print-emitted-asm", cl::Hidden,
37 cl::desc("Dump emitter generated instructions as assembly"));
38 static cl::opt<bool> PrintGCInfo("print-gc", cl::Hidden,
39 cl::desc("Dump garbage collector data"));
41 // When this works it will be on by default.
42 static cl::opt<bool>
43 DisablePostRAScheduler("disable-post-RA-scheduler",
44 cl::desc("Disable scheduling after register allocation"),
45 cl::init(true));
47 // Enable or disable FastISel. Both options are needed, because
48 // FastISel is enabled by default with -fast, and we wish to be
49 // able to enable or disable fast-isel independently from -fast.
50 static cl::opt<cl::boolOrDefault>
51 EnableFastISelOption("fast-isel", cl::Hidden,
52 cl::desc("Enable the experimental \"fast\" instruction selector"));
54 FileModel::Model
55 LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
56 raw_ostream &Out,
57 CodeGenFileType FileType,
58 CodeGenOpt::Level OptLevel) {
59 // Add common CodeGen passes.
60 if (addCommonCodeGenPasses(PM, OptLevel))
61 return FileModel::Error;
63 // Fold redundant debug labels.
64 PM.add(createDebugLabelFoldingPass());
66 if (PrintMachineCode)
67 PM.add(createMachineFunctionPrinterPass(cerr));
69 if (addPreEmitPass(PM, OptLevel) && PrintMachineCode)
70 PM.add(createMachineFunctionPrinterPass(cerr));
72 if (OptLevel != CodeGenOpt::None)
73 PM.add(createCodePlacementOptPass());
75 switch (FileType) {
76 default:
77 break;
78 case TargetMachine::AssemblyFile:
79 if (addAssemblyEmitter(PM, OptLevel, getAsmVerbosityDefault(), Out))
80 return FileModel::Error;
81 return FileModel::AsmFile;
82 case TargetMachine::ObjectFile:
83 if (getMachOWriterInfo())
84 return FileModel::MachOFile;
85 else if (getELFWriterInfo())
86 return FileModel::ElfFile;
89 return FileModel::Error;
92 /// addPassesToEmitFileFinish - If the passes to emit the specified file had to
93 /// be split up (e.g., to add an object writer pass), this method can be used to
94 /// finish up adding passes to emit the file, if necessary.
95 bool LLVMTargetMachine::addPassesToEmitFileFinish(PassManagerBase &PM,
96 MachineCodeEmitter *MCE,
97 CodeGenOpt::Level OptLevel) {
98 if (MCE)
99 addSimpleCodeEmitter(PM, OptLevel, PrintEmittedAsm, *MCE);
101 PM.add(createGCInfoDeleter());
103 // Delete machine code for this function
104 PM.add(createMachineCodeDeleter());
106 return false; // success!
109 /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
110 /// get machine code emitted. This uses a MachineCodeEmitter object to handle
111 /// actually outputting the machine code and resolving things like the address
112 /// of functions. This method should returns true if machine code emission is
113 /// not supported.
115 bool LLVMTargetMachine::addPassesToEmitMachineCode(PassManagerBase &PM,
116 MachineCodeEmitter &MCE,
117 CodeGenOpt::Level OptLevel) {
118 // Add common CodeGen passes.
119 if (addCommonCodeGenPasses(PM, OptLevel))
120 return true;
122 if (addPreEmitPass(PM, OptLevel) && PrintMachineCode)
123 PM.add(createMachineFunctionPrinterPass(cerr));
125 addCodeEmitter(PM, OptLevel, PrintEmittedAsm, MCE);
127 PM.add(createGCInfoDeleter());
129 // Delete machine code for this function
130 PM.add(createMachineCodeDeleter());
132 return false; // success!
135 /// addCommonCodeGenPasses - Add standard LLVM codegen passes used for both
136 /// emitting to assembly files or machine code output.
138 bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
139 CodeGenOpt::Level OptLevel) {
140 // Standard LLVM-Level Passes.
142 // Run loop strength reduction before anything else.
143 if (OptLevel != CodeGenOpt::None) {
144 PM.add(createLoopStrengthReducePass(getTargetLowering()));
145 if (PrintLSR)
146 PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &errs()));
149 PM.add(createGCLoweringPass());
151 if (!getTargetAsmInfo()->doesSupportExceptionHandling())
152 PM.add(createLowerInvokePass(getTargetLowering()));
154 // Make sure that no unreachable blocks are instruction selected.
155 PM.add(createUnreachableBlockEliminationPass());
157 if (OptLevel != CodeGenOpt::None)
158 PM.add(createCodeGenPreparePass(getTargetLowering()));
160 PM.add(createStackProtectorPass(getTargetLowering()));
162 if (PrintISelInput)
163 PM.add(createPrintFunctionPass("\n\n"
164 "*** Final LLVM Code input to ISel ***\n",
165 &errs()));
167 // Standard Lower-Level Passes.
169 // Enable FastISel with -fast, but allow that to be overridden.
170 if (EnableFastISelOption == cl::BOU_TRUE ||
171 (OptLevel == CodeGenOpt::None && EnableFastISelOption != cl::BOU_FALSE))
172 EnableFastISel = true;
174 // Ask the target for an isel.
175 if (addInstSelector(PM, OptLevel))
176 return true;
178 // Print the instruction selected machine code...
179 if (PrintMachineCode)
180 PM.add(createMachineFunctionPrinterPass(cerr));
182 if (OptLevel != CodeGenOpt::None) {
183 PM.add(createMachineLICMPass());
184 PM.add(createMachineSinkingPass());
187 // Run pre-ra passes.
188 if (addPreRegAlloc(PM, OptLevel) && PrintMachineCode)
189 PM.add(createMachineFunctionPrinterPass(cerr));
191 // Perform register allocation.
192 PM.add(createRegisterAllocator());
194 // Perform stack slot coloring.
195 if (OptLevel != CodeGenOpt::None)
196 PM.add(createStackSlotColoringPass(OptLevel >= CodeGenOpt::Aggressive));
198 if (PrintMachineCode) // Print the register-allocated code
199 PM.add(createMachineFunctionPrinterPass(cerr));
201 // Run post-ra passes.
202 if (addPostRegAlloc(PM, OptLevel) && PrintMachineCode)
203 PM.add(createMachineFunctionPrinterPass(cerr));
205 if (PrintMachineCode)
206 PM.add(createMachineFunctionPrinterPass(cerr));
208 PM.add(createLowerSubregsPass());
210 if (PrintMachineCode) // Print the subreg lowered code
211 PM.add(createMachineFunctionPrinterPass(cerr));
213 // Insert prolog/epilog code. Eliminate abstract frame index references...
214 PM.add(createPrologEpilogCodeInserter());
216 if (PrintMachineCode)
217 PM.add(createMachineFunctionPrinterPass(cerr));
219 // Second pass scheduler.
220 if (OptLevel != CodeGenOpt::None && !DisablePostRAScheduler) {
221 PM.add(createPostRAScheduler());
223 if (PrintMachineCode)
224 PM.add(createMachineFunctionPrinterPass(cerr));
227 // Branch folding must be run after regalloc and prolog/epilog insertion.
228 if (OptLevel != CodeGenOpt::None)
229 PM.add(createBranchFoldingPass(getEnableTailMergeDefault()));
231 if (PrintMachineCode)
232 PM.add(createMachineFunctionPrinterPass(cerr));
234 PM.add(createGCMachineCodeAnalysisPass());
236 if (PrintMachineCode)
237 PM.add(createMachineFunctionPrinterPass(cerr));
239 if (PrintGCInfo)
240 PM.add(createGCInfoPrinter(*cerr));
242 return false;