-X86TargetMachine::X86TargetMachine(unsigned Config)
- : TargetMachine("X86",
- (Config & TM::EndianMask) == TM::LittleEndian,
- 1, 4,
- (Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4,
- (Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4),
- FrameInfo(TargetFrameInfo::StackGrowsDown, 8/*16 for SSE*/, 4) {
+X86TargetMachine::X86TargetMachine(const Module &M)
+ : TargetMachine("X86", true, 4, 4, 4, 4, 4),
+ FrameInfo(TargetFrameInfo::StackGrowsDown, 8/*16 for SSE*/, 4),
+ JITInfo(*this) {
+}
+
+
+// addPassesToEmitAssembly - We currently use all of the same passes as the JIT
+// does to emit statically compiled machine code.
+bool X86TargetMachine::addPassesToEmitAssembly(PassManager &PM,
+ std::ostream &Out) {
+ // FIXME: Implement the switch instruction in the instruction selector!
+ PM.add(createLowerSwitchPass());
+
+ // FIXME: Implement the invoke/unwind instructions!
+ PM.add(createLowerInvokePass());
+
+ // FIXME: The code generator does not properly handle functions with
+ // unreachable basic blocks.
+ PM.add(createCFGSimplificationPass());
+
+ if (NoPatternISel)
+ PM.add(createX86SimpleInstructionSelector(*this));
+ else
+ PM.add(createX86PatternInstructionSelector(*this));
+
+ // Run optional SSA-based machine code optimizations next...
+ if (!NoSSAPeephole)
+ PM.add(createX86SSAPeepholeOptimizerPass());
+
+ // Print the instruction selected machine code...
+ if (PrintCode)
+ PM.add(createMachineFunctionPrinterPass());
+
+ // kill floating point registers at the end of basic blocks. this is
+ // done because the floating point register stackifier cannot handle
+ // floating point regs that are live across basic blocks.
+ PM.add(createX86FloatingPointKillerPass());
+
+ // Perform register allocation to convert to a concrete x86 representation
+ PM.add(createRegisterAllocator());
+
+ if (PrintCode)
+ PM.add(createMachineFunctionPrinterPass());
+
+ PM.add(createX86FloatingPointStackifierPass());
+
+ if (PrintCode)
+ PM.add(createMachineFunctionPrinterPass());
+
+ // Insert prolog/epilog code. Eliminate abstract frame index references...
+ PM.add(createPrologEpilogCodeInserter());
+
+ PM.add(createX86PeepholeOptimizerPass());
+
+ if (PrintCode) // Print the register-allocated code
+ PM.add(createX86CodePrinterPass(std::cerr, *this));
+
+ PM.add(createX86CodePrinterPass(Out, *this));
+ return false; // success!