PPCTargetMachine.cpp revision 7cd444082e54207fbb8ed0c958c7a23ed334650c
1//===-- PowerPCTargetMachine.cpp - Define TargetMachine for PowerPC -------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// 11//===----------------------------------------------------------------------===// 12 13#include "PowerPCTargetMachine.h" 14#include "PowerPC.h" 15#include "llvm/Module.h" 16#include "llvm/PassManager.h" 17#include "llvm/CodeGen/IntrinsicLowering.h" 18#include "llvm/CodeGen/MachineFunction.h" 19#include "llvm/CodeGen/Passes.h" 20#include "llvm/Target/TargetMachineImpls.h" 21#include "llvm/Transforms/Scalar.h" 22using namespace llvm; 23 24// allocatePowerPCTargetMachine - Allocate and return a subclass of 25// TargetMachine that implements the PowerPC backend. 26// 27TargetMachine *llvm::allocatePowerPCTargetMachine(const Module &M, 28 IntrinsicLowering *IL) { 29 return new PowerPCTargetMachine(M, IL); 30} 31 32/// PowerPCTargetMachine ctor - Create an ILP32 architecture model 33/// 34/// FIXME: Should double alignment be 8 bytes? Then we get a PtrAl != DoubleAl abort 35PowerPCTargetMachine::PowerPCTargetMachine(const Module &M, 36 IntrinsicLowering *IL) 37 : TargetMachine("PowerPC", IL, false, 4, 4, 4, 4, 4, 4, 4, 4), 38 FrameInfo(TargetFrameInfo::StackGrowsDown, 16, -4), JITInfo(*this) { 39} 40 41/// addPassesToEmitAssembly - Add passes to the specified pass manager 42/// to implement a static compiler for this target. 43/// 44bool PowerPCTargetMachine::addPassesToEmitAssembly(PassManager &PM, 45 std::ostream &Out) { 46 // FIXME: Implement efficient support for garbage collection intrinsics. 47 PM.add(createLowerGCPass()); 48 49 // FIXME: Implement the invoke/unwind instructions! 50 PM.add(createLowerInvokePass()); 51 52 // FIXME: The code generator does not properly handle functions with 53 // unreachable basic blocks. 54 PM.add(createCFGSimplificationPass()); 55 56 // FIXME: Implement the switch instruction in the instruction selector! 57 PM.add(createLowerSwitchPass()); 58 59 PM.add(createPPCSimpleInstructionSelector(*this)); 60 61 if (PrintMachineCode) 62 PM.add(createMachineFunctionPrinterPass(&std::cerr)); 63 64 PM.add(createRegisterAllocator()); 65 66 if (PrintMachineCode) 67 PM.add(createMachineFunctionPrinterPass(&std::cerr)); 68 69 PM.add(createPrologEpilogCodeInserter()); 70 PM.add(createPPCCodePrinterPass(Out, *this)); 71 PM.add(createMachineCodeDeleter()); 72 return false; 73} 74 75/// addPassesToJITCompile - Add passes to the specified pass manager to 76/// implement a fast dynamic compiler for this target. 77/// 78void PowerPCJITInfo::addPassesToJITCompile(FunctionPassManager &PM) { 79 // FIXME: Implement efficient support for garbage collection intrinsics. 80 PM.add(createLowerGCPass()); 81 82 // FIXME: Implement the invoke/unwind instructions! 83 PM.add(createLowerInvokePass()); 84 85 // FIXME: The code generator does not properly handle functions with 86 // unreachable basic blocks. 87 PM.add(createCFGSimplificationPass()); 88 89 // FIXME: Implement the switch instruction in the instruction selector! 90 PM.add(createLowerSwitchPass()); 91 92 PM.add(createPPCSimpleInstructionSelector(TM)); 93 PM.add(createRegisterAllocator()); 94 PM.add(createPrologEpilogCodeInserter()); 95} 96 97