1 //===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by Chris Lattner and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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/CodeGen/Passes.h"
18 #include "llvm/Target/TargetOptions.h"
19 #include "llvm/Transforms/Scalar.h"
23 bool LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM,
25 CodeGenFileType FileType,
27 // Standard LLVM-Level Passes.
29 // Run loop strength reduction before anything else.
30 if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
32 // FIXME: Implement efficient support for garbage collection intrinsics.
33 PM.add(createLowerGCPass());
35 // FIXME: Implement the invoke/unwind instructions!
36 PM.add(createLowerInvokePass(getTargetLowering()));
38 // Make sure that no unreachable blocks are instruction selected.
39 PM.add(createUnreachableBlockEliminationPass());
42 // Ask the target for an isel.
43 if (addInstSelector(PM, Fast))
47 // Print the instruction selected machine code...
49 PM.add(createMachineFunctionPrinterPass(&std::cerr));
51 // Perform register allocation to convert to a concrete x86 representation
52 PM.add(createRegisterAllocator());
55 PM.add(createMachineFunctionPrinterPass(&std::cerr));
58 // Run post-ra passes.
59 if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
60 PM.add(createMachineFunctionPrinterPass(&std::cerr));
63 // Insert prolog/epilog code. Eliminate abstract frame index references...
64 PM.add(createPrologEpilogCodeInserter());
66 // Branch folding must be run after regalloc and prolog/epilog insertion.
68 PM.add(createBranchFoldingPass());
70 // Fold redundant debug labels.
71 PM.add(createDebugLabelFoldingPass());
73 if (PrintMachineCode) // Print the register-allocated code
74 PM.add(createMachineFunctionPrinterPass(&std::cerr));
77 if (addPreEmitPass(PM, Fast) && PrintMachineCode)
78 PM.add(createMachineFunctionPrinterPass(&std::cerr));
83 case TargetMachine::AssemblyFile:
84 if (addAssemblyEmitter(PM, Fast, Out))
87 case TargetMachine::ObjectFile:
88 if (addObjectWriter(PM, Fast, Out))
93 // Delete machine code for this function
94 PM.add(createMachineCodeDeleter());
96 return false; // success!
99 /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
100 /// get machine code emitted. This uses a MachineCodeEmitter object to handle
101 /// actually outputting the machine code and resolving things like the address
102 /// of functions. This method should returns true if machine code emission is
105 bool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
106 MachineCodeEmitter &MCE,
108 // Standard LLVM-Level Passes.
110 // Run loop strength reduction before anything else.
111 if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
113 // FIXME: Implement efficient support for garbage collection intrinsics.
114 PM.add(createLowerGCPass());
116 // FIXME: Implement the invoke/unwind instructions!
117 PM.add(createLowerInvokePass(getTargetLowering()));
119 // Make sure that no unreachable blocks are instruction selected.
120 PM.add(createUnreachableBlockEliminationPass());
123 // Ask the target for an isel.
124 if (addInstSelector(PM, Fast))
128 // Print the instruction selected machine code...
129 if (PrintMachineCode)
130 PM.add(createMachineFunctionPrinterPass(&std::cerr));
132 // Perform register allocation to convert to a concrete x86 representation
133 PM.add(createRegisterAllocator());
135 if (PrintMachineCode)
136 PM.add(createMachineFunctionPrinterPass(&std::cerr));
139 // Run post-ra passes.
140 if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
141 PM.add(createMachineFunctionPrinterPass(&std::cerr));
144 // Insert prolog/epilog code. Eliminate abstract frame index references...
145 PM.add(createPrologEpilogCodeInserter());
147 if (PrintMachineCode) // Print the register-allocated code
148 PM.add(createMachineFunctionPrinterPass(&std::cerr));
150 // Branch folding must be run after regalloc and prolog/epilog insertion.
152 PM.add(createBranchFoldingPass());
154 if (addPreEmitPass(PM, Fast) && PrintMachineCode)
155 PM.add(createMachineFunctionPrinterPass(&std::cerr));
158 addCodeEmitter(PM, Fast, MCE);
160 // Delete machine code for this function
161 PM.add(createMachineCodeDeleter());
163 return false; // success!