1 //===-- MipsTargetMachine.cpp - Define TargetMachine for Mips -------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Implements the info about Mips target spec. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "Mips.h" 15 #include "MipsTargetAsmInfo.h" 16 #include "MipsTargetMachine.h" 17 #include "llvm/Module.h" 18 #include "llvm/PassManager.h" 19 #include "llvm/Target/TargetMachineRegistry.h" 20 using namespace llvm; 21 22 // Register the target. 23 static RegisterTarget<MipsTargetMachine> X(TheMipsTarget, "mips", "Mips"); 24 25 static RegisterTarget<MipselTargetMachine> Y(TheMipselTarget, "mipsel", 26 "Mipsel"); 27 28 // Force static initialization. 29 extern "C" void LLVMInitializeMipsTarget() { } 30 31 const TargetAsmInfo *MipsTargetMachine:: 32 createTargetAsmInfo() const 33 { 34 return new MipsTargetAsmInfo(*this); 35 } 36 37 // DataLayout --> Big-endian, 32-bit pointer/ABI/alignment 38 // The stack is always 8 byte aligned 39 // On function prologue, the stack is created by decrementing 40 // its pointer. Once decremented, all references are done with positive 41 // offset from the stack/frame pointer, using StackGrowsUp enables 42 // an easier handling. 43 // Using CodeModel::Large enables different CALL behavior. 44 MipsTargetMachine:: 45 MipsTargetMachine(const Target &T, const Module &M, const std::string &FS, 46 bool isLittle=false): 47 LLVMTargetMachine(T), 48 Subtarget(*this, M, FS, isLittle), 49 DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32") : 50 std::string("E-p:32:32:32-i8:8:32-i16:16:32")), 51 InstrInfo(*this), 52 FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0), 53 TLInfo(*this) 54 { 55 // Abicall enables PIC by default 56 if (Subtarget.hasABICall()) 57 setRelocationModel(Reloc::PIC_); 58 59 // TODO: create an option to enable long calls, like -mlong-calls, 60 // that would be our CodeModel::Large. It must not work with Abicall. 61 if (getCodeModel() == CodeModel::Default) 62 setCodeModel(CodeModel::Small); 63 } 64 65 MipselTargetMachine:: 66 MipselTargetMachine(const Target &T, const Module &M, const std::string &FS) : 67 MipsTargetMachine(T, M, FS, true) {} 68 69 // Install an instruction selector pass using 70 // the ISelDag to gen Mips code. 71 bool MipsTargetMachine:: 72 addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel) 73 { 74 PM.add(createMipsISelDag(*this)); 75 return false; 76 } 77 78 // Implemented by targets that want to run passes immediately before 79 // machine code is emitted. return true if -print-machineinstrs should 80 // print out the code after the passes. 81 bool MipsTargetMachine:: 82 addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel) 83 { 84 PM.add(createMipsDelaySlotFillerPass(*this)); 85 return true; 86 } 87