MipsTargetMachine.cpp revision 221345
118334Speter//===-- MipsTargetMachine.cpp - Define TargetMachine for Mips -------------===// 290285Sobrien// 390285Sobrien// The LLVM Compiler Infrastructure 418334Speter// 590285Sobrien// This file is distributed under the University of Illinois Open Source 618334Speter// License. See LICENSE.TXT for details. 790285Sobrien// 890285Sobrien//===----------------------------------------------------------------------===// 990285Sobrien// 1090285Sobrien// Implements the info about Mips target spec. 1118334Speter// 1290285Sobrien//===----------------------------------------------------------------------===// 1390285Sobrien 1490285Sobrien#include "Mips.h" 1590285Sobrien#include "MipsMCAsmInfo.h" 1618334Speter#include "MipsTargetMachine.h" 1718334Speter#include "llvm/PassManager.h" 1890285Sobrien#include "llvm/Target/TargetRegistry.h" 1990285Sobrienusing namespace llvm; 2090285Sobrien 2118334Speterextern "C" void LLVMInitializeMipsTarget() { 2290285Sobrien // Register the target. 2352557Sobrien RegisterTargetMachine<MipsTargetMachine> X(TheMipsTarget); 2418334Speter RegisterTargetMachine<MipselTargetMachine> Y(TheMipselTarget); 2552557Sobrien RegisterAsmInfo<MipsMCAsmInfo> A(TheMipsTarget); 2618334Speter RegisterAsmInfo<MipsMCAsmInfo> B(TheMipselTarget); 2718334Speter} 2818334Speter 2918334Speter// DataLayout --> Big-endian, 32-bit pointer/ABI/alignment 3018334Speter// The stack is always 8 byte aligned 3118334Speter// On function prologue, the stack is created by decrementing 3218334Speter// its pointer. Once decremented, all references are done with positive 3318334Speter// offset from the stack/frame pointer, using StackGrowsUp enables 3418334Speter// an easier handling. 3518334Speter// Using CodeModel::Large enables different CALL behavior. 3618334SpeterMipsTargetMachine:: 3718334SpeterMipsTargetMachine(const Target &T, const std::string &TT, const std::string &FS, 3818334Speter bool isLittle=false): 3918334Speter LLVMTargetMachine(T, TT), 4018334Speter Subtarget(TT, FS, isLittle), 4118334Speter DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32-n32") : 4218334Speter std::string("E-p:32:32:32-i8:8:32-i16:16:32-n32")), 4318334Speter InstrInfo(*this), 4418334Speter FrameLowering(Subtarget), 4518334Speter TLInfo(*this), TSInfo(*this) { 4618334Speter // Abicall enables PIC by default 4718334Speter if (getRelocationModel() == Reloc::Default) { 4818334Speter if (Subtarget.isABI_O32()) 4918334Speter setRelocationModel(Reloc::PIC_); 5018334Speter else 5118334Speter setRelocationModel(Reloc::Static); 5218334Speter } 5318334Speter} 5418334Speter 5518334SpeterMipselTargetMachine:: 5618334SpeterMipselTargetMachine(const Target &T, const std::string &TT, 5718334Speter const std::string &FS) : 5818334Speter MipsTargetMachine(T, TT, FS, true) {} 5918334Speter 6018334Speter// Install an instruction selector pass using 6118334Speter// the ISelDag to gen Mips code. 6218334Speterbool MipsTargetMachine:: 6318334SpeteraddInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel) 6418334Speter{ 6518334Speter PM.add(createMipsISelDag(*this)); 6618334Speter return false; 6718334Speter} 6818334Speter 6918334Speter// Implemented by targets that want to run passes immediately before 7018334Speter// machine code is emitted. return true if -print-machineinstrs should 7118334Speter// print out the code after the passes. 7218334Speterbool MipsTargetMachine:: 7318334SpeteraddPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel) 7418334Speter{ 7518334Speter PM.add(createMipsDelaySlotFillerPass(*this)); 7618334Speter return true; 7718334Speter} 7818334Speter 7918334Speterbool MipsTargetMachine:: 8018334SpeteraddPostRegAlloc(PassManagerBase &PM, CodeGenOpt::Level OptLevel) { 8118334Speter PM.add(createMipsExpandPseudoPass(*this)); 8218334Speter return true; 8318334Speter} 8418334Speter