SparcTargetMachine.cpp revision 98a366d547772010e94609e4584489b3e5ce0043
1af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com//===-- SparcTargetMachine.cpp - Define TargetMachine for Sparc -----------===// 2af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 3af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// The LLVM Compiler Infrastructure 4af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 5af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// This file is distributed under the University of Illinois Open Source 6af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// License. See LICENSE.TXT for details. 7af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 8af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com//===----------------------------------------------------------------------===// 9af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 10af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// 11af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com//===----------------------------------------------------------------------===// 12c636308f0ab6fb1af7589eaf0917103dc22fa61ephilip.liard@gmail.com 13af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "SparcTargetAsmInfo.h" 14af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "SparcTargetMachine.h" 15af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "Sparc.h" 16af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#include "llvm/Module.h" 17fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com#include "llvm/PassManager.h" 18fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.com#include "llvm/Target/TargetMachineRegistry.h" 19fa6ddeed736e42c266027a0d7b696909083d066bphilip.liard@gmail.comusing namespace llvm; 20af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 21af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// SparcTargetMachineModule - Note that this is used on hosts that 22af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// cannot link in a library unless there are references into the 23af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// library. In particular, it seems that it is not possible to get 24af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// things to work on Win32 without this. Though it is unused, do not 25af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// remove it. 26af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comextern "C" int SparcTargetMachineModule; 27af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comint SparcTargetMachineModule = 0; 28af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 29af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com// Register the target. 30af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comstatic RegisterTarget<SparcTargetMachine> X("sparc", "SPARC"); 31af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 32af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comconst TargetAsmInfo *SparcTargetMachine::createTargetAsmInfo() const { 33af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // FIXME: Handle Solaris subtarget someday :) 34af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return new SparcELFTargetAsmInfo(*this); 35af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 36af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 37af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// SparcTargetMachine ctor - Create an ILP32 architecture model 38af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// 39af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comSparcTargetMachine::SparcTargetMachine(const Module &M, const std::string &FS) 40af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com : DataLayout("E-p:32:32-f128:128:128"), 41af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com Subtarget(M, FS), TLInfo(*this), InstrInfo(Subtarget), 42af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) { 43af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 44af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 45af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.comunsigned SparcTargetMachine::getModuleMatchQuality(const Module &M) { 46af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com std::string TT = M.getTargetTriple(); 47af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "sparc-") 48af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return 20; 49af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 50af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // If the target triple is something non-sparc, we don't match. 51af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com if (!TT.empty()) return 0; 52af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 53af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com if (M.getEndianness() == Module::BigEndian && 54af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com M.getPointerSize() == Module::Pointer32) 55af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#ifdef __sparc__ 56af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return 20; // BE/32 ==> Prefer sparc on sparc 57af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#else 58af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return 5; // BE/32 ==> Prefer ppc elsewhere 59af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#endif 60af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com else if (M.getEndianness() != Module::AnyEndianness || 61af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com M.getPointerSize() != Module::AnyPointerSize) 62af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return 0; // Match for some other target 63af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 64af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#if defined(__sparc__) 65af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return 10; 66af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#else 67af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return 0; 68af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com#endif 69af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 70af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 71af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.combool SparcTargetMachine::addInstSelector(PassManagerBase &PM, 72af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com CodeGenOpt::Level OptLevel) { 73af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com PM.add(createSparcISelDag(*this)); 74af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return false; 75af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 76af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 77af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// addPreEmitPass - This pass may be implemented by targets that want to run 78af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// passes immediately before machine code is emitted. This should return 79af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com/// true if -print-machineinstrs should print out the code after the passes. 80af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.combool SparcTargetMachine::addPreEmitPass(PassManagerBase &PM, 81af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com CodeGenOpt::Level OptLevel){ 82af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com PM.add(createSparcFPMoverPass(*this)); 83af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com PM.add(createSparcDelaySlotFillerPass(*this)); 84af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return true; 85af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 86af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com 87af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.combool SparcTargetMachine::addAssemblyEmitter(PassManagerBase &PM, 88af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com CodeGenOpt::Level OptLevel, 89af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com bool Verbose, 90af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com raw_ostream &Out) { 91af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com // Output assembly language. 92af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com PM.add(createSparcCodePrinterPass(Out, *this, OptLevel, Verbose)); 93af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com return false; 94af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com} 95af4a2ce290b619b39c2cb2a682ea4d7746d3fb21philip.liard@gmail.com