LLVMTargetMachine.cpp revision 04523eab6bbc5d55a6e3f3296ddd583c8ad5ebb1
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"
20using namespace llvm;
21
22FileModel::Model
23LLVMTargetMachine::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  // Ask the target for an isel.
42  if (addInstSelector(PM, Fast))
43    return FileModel::Error;
44
45  // Print the instruction selected machine code...
46  if (PrintMachineCode)
47    PM.add(createMachineFunctionPrinterPass(cerr));
48
49  // Perform register allocation to convert to a concrete x86 representation
50  PM.add(createRegisterAllocator());
51
52  if (PrintMachineCode)
53    PM.add(createMachineFunctionPrinterPass(cerr));
54
55  // Run post-ra passes.
56  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
57    PM.add(createMachineFunctionPrinterPass(cerr));
58
59  // Insert prolog/epilog code.  Eliminate abstract frame index references...
60  PM.add(createPrologEpilogCodeInserter());
61
62  // Branch folding must be run after regalloc and prolog/epilog insertion.
63  if (!Fast)
64    PM.add(createBranchFoldingPass());
65
66  // Fold redundant debug labels.
67  PM.add(createDebugLabelFoldingPass());
68
69  if (PrintMachineCode)  // Print the register-allocated code
70    PM.add(createMachineFunctionPrinterPass(cerr));
71
72  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
73    PM.add(createMachineFunctionPrinterPass(cerr));
74
75  switch (FileType) {
76  default:
77    break;
78  case TargetMachine::AssemblyFile:
79    if (addAssemblyEmitter(PM, Fast, 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;
87  }
88
89  return FileModel::Error;
90}
91
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.
95bool LLVMTargetMachine::addPassesToEmitFileFinish(FunctionPassManager &PM,
96                                                  MachineCodeEmitter *MCE,
97                                                  bool Fast) {
98  if (MCE)
99    addSimpleCodeEmitter(PM, Fast, *MCE);
100
101  // Delete machine code for this function
102  PM.add(createMachineCodeDeleter());
103
104  return false; // success!
105}
106
107/// addPassesToEmitMachineCode - Add passes to the specified pass manager to
108/// get machine code emitted.  This uses a MachineCodeEmitter object to handle
109/// actually outputting the machine code and resolving things like the address
110/// of functions.  This method should returns true if machine code emission is
111/// not supported.
112///
113bool LLVMTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM,
114                                                   MachineCodeEmitter &MCE,
115                                                   bool Fast) {
116  // Standard LLVM-Level Passes.
117
118  // Run loop strength reduction before anything else.
119  if (!Fast) PM.add(createLoopStrengthReducePass(getTargetLowering()));
120
121  // FIXME: Implement efficient support for garbage collection intrinsics.
122  PM.add(createLowerGCPass());
123
124  // FIXME: Implement the invoke/unwind instructions!
125  PM.add(createLowerInvokePass(getTargetLowering()));
126
127  // Make sure that no unreachable blocks are instruction selected.
128  PM.add(createUnreachableBlockEliminationPass());
129
130  // Ask the target for an isel.
131  if (addInstSelector(PM, Fast))
132    return true;
133
134  // Print the instruction selected machine code...
135  if (PrintMachineCode)
136    PM.add(createMachineFunctionPrinterPass(cerr));
137
138  // Perform register allocation to convert to a concrete x86 representation
139  PM.add(createRegisterAllocator());
140
141  if (PrintMachineCode)
142    PM.add(createMachineFunctionPrinterPass(cerr));
143
144  // Run post-ra passes.
145  if (addPostRegAlloc(PM, Fast) && PrintMachineCode)
146    PM.add(createMachineFunctionPrinterPass(cerr));
147
148  // Insert prolog/epilog code.  Eliminate abstract frame index references...
149  PM.add(createPrologEpilogCodeInserter());
150
151  if (PrintMachineCode)  // Print the register-allocated code
152    PM.add(createMachineFunctionPrinterPass(cerr));
153
154  // Branch folding must be run after regalloc and prolog/epilog insertion.
155  if (!Fast)
156    PM.add(createBranchFoldingPass());
157
158  if (addPreEmitPass(PM, Fast) && PrintMachineCode)
159    PM.add(createMachineFunctionPrinterPass(cerr));
160
161  addCodeEmitter(PM, Fast, MCE);
162
163  // Delete machine code for this function
164  PM.add(createMachineCodeDeleter());
165
166  return false; // success!
167}
168