add setJumpBufSize() and setJumpBufAlignment() to target-lowering.
[oota-llvm.git] / lib / CodeGen / LLVMTargetMachine.cpp
1 //===-- LLVMTargetMachine.cpp - Implement the LLVMTargetMachine class -----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
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.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the LLVMTargetMachine class.
11 //
12 //===----------------------------------------------------------------------===//
13
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"
20 #include <iostream>
21 using namespace llvm;
22
23 bool LLVMTargetMachine::addPassesToEmitFile(FunctionPassManager &PM,
24                                             std::ostream &Out,
25                                             CodeGenFileType FileType,
26                                             bool Fast) {
27   // Standard LLVM-Level Passes.
28   
29   // Run loop strength reduction before anything else.
30   if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
31   
32   // FIXME: Implement efficient support for garbage collection intrinsics.
33   PM.add(createLowerGCPass());
34   
35   // FIXME: Implement the invoke/unwind instructions!
36   PM.add(createLowerInvokePass(getTargetLowering()));
37   
38   // Make sure that no unreachable blocks are instruction selected.
39   PM.add(createUnreachableBlockEliminationPass());
40   
41   
42   // Ask the target for an isel.
43   if (addInstSelector(PM, Fast))
44     return true;
45   
46   
47   // Print the instruction selected machine code...
48   if (PrintMachineCode)
49     PM.add(createMachineFunctionPrinterPass(&std::cerr));
50   
51   // Perform register allocation to convert to a concrete x86 representation
52   PM.add(createRegisterAllocator());
53   
54   if (PrintMachineCode)
55     PM.add(createMachineFunctionPrinterPass(&std::cerr));
56   
57   
58   // Run post-ra passes.
59   if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
60     PM.add(createMachineFunctionPrinterPass(&std::cerr));
61   
62   
63   // Insert prolog/epilog code.  Eliminate abstract frame index references...
64   PM.add(createPrologEpilogCodeInserter());
65   
66   if (PrintMachineCode)  // Print the register-allocated code
67     PM.add(createMachineFunctionPrinterPass(&std::cerr));
68   
69   
70   if (addPreEmitPass(PM, Fast) && PrintMachineCode)
71     PM.add(createMachineFunctionPrinterPass(&std::cerr));
72   
73   
74   switch (FileType) {
75     default: return true;
76     case TargetMachine::AssemblyFile:
77       if (addAssemblyEmitter(PM, Fast, Out))
78         return true;
79       break;
80     case TargetMachine::ObjectFile:
81       if (addObjectWriter(PM, Fast, Out))
82         return true;
83       break;
84   }
85   
86   // Delete machine code for this function
87   PM.add(createMachineCodeDeleter());
88   
89   return false; // success!
90 }
91
92 /// addPassesToEmitMachineCode - Add passes to the specified pass manager to
93 /// get machine code emitted.  This uses a MachineCodeEmitter object to handle
94 /// actually outputting the machine code and resolving things like the address
95 /// of functions.  This method should returns true if machine code emission is
96 /// not supported.
97 ///
98 bool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
99                                                    MachineCodeEmitter &MCE,
100                                                    bool Fast) {
101   // Standard LLVM-Level Passes.
102   
103   // Run loop strength reduction before anything else.
104   if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
105   
106   // FIXME: Implement efficient support for garbage collection intrinsics.
107   PM.add(createLowerGCPass());
108   
109   // FIXME: Implement the invoke/unwind instructions!
110   PM.add(createLowerInvokePass(getTargetLowering()));
111   
112   // Make sure that no unreachable blocks are instruction selected.
113   PM.add(createUnreachableBlockEliminationPass());
114   
115   
116   // Ask the target for an isel.
117   if (addInstSelector(PM, Fast))
118     return true;
119   
120   
121   // Print the instruction selected machine code...
122   if (PrintMachineCode)
123     PM.add(createMachineFunctionPrinterPass(&std::cerr));
124   
125   // Perform register allocation to convert to a concrete x86 representation
126   PM.add(createRegisterAllocator());
127   
128   if (PrintMachineCode)
129     PM.add(createMachineFunctionPrinterPass(&std::cerr));
130   
131   
132   // Run post-ra passes.
133   if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
134     PM.add(createMachineFunctionPrinterPass(&std::cerr));
135   
136   
137   // Insert prolog/epilog code.  Eliminate abstract frame index references...
138   PM.add(createPrologEpilogCodeInserter());
139   
140   if (PrintMachineCode)  // Print the register-allocated code
141     PM.add(createMachineFunctionPrinterPass(&std::cerr));
142   
143   
144   if (addPreEmitPass(PM, Fast) && PrintMachineCode)
145     PM.add(createMachineFunctionPrinterPass(&std::cerr));
146   
147   
148   addCodeEmitter(PM, Fast, MCE);
149   
150   // Delete machine code for this function
151   PM.add(createMachineCodeDeleter());
152   
153   return false; // success!
154 }