SparcTargetMachine.cpp revision 71847813bc419f7a0667468136a07429c6d9f164
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//===-- SparcTargetMachine.cpp - Define TargetMachine for Sparc -----------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "SparcTargetAsmInfo.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SparcTargetMachine.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Sparc.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Module.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/PassManager.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "llvm/Target/TargetMachineRegistry.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using namespace llvm; 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Register the target. 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)static RegisterTarget<SparcTargetMachine> X("sparc", "SPARC"); 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// No assembler printer by default 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SparcTargetMachine::AsmPrinterCtorFn SparcTargetMachine::AsmPrinterCtor = 0; 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Force static initialization. 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)extern "C" void LLVMInitializeSparcTarget() { } 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const TargetAsmInfo *SparcTargetMachine::createTargetAsmInfo() const { 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // FIXME: Handle Solaris subtarget someday :) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return new SparcELFTargetAsmInfo(*this); 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// SparcTargetMachine ctor - Create an ILP32 architecture model 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)SparcTargetMachine::SparcTargetMachine(const Module &M, const std::string &FS) 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : DataLayout("E-p:32:32-f128:128:128"), 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Subtarget(M, FS), TLInfo(*this), InstrInfo(Subtarget), 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) { 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)unsigned SparcTargetMachine::getModuleMatchQuality(const Module &M) { 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string TT = M.getTargetTriple(); 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "sparc-") 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 20; 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the target triple is something non-sparc, we don't match. 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!TT.empty()) return 0; 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (M.getEndianness() == Module::BigEndian && 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) M.getPointerSize() == Module::Pointer32) 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifdef __sparc__ 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 20; // BE/32 ==> Prefer sparc on sparc 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 5; // BE/32 ==> Prefer ppc elsewhere 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) else if (M.getEndianness() != Module::AnyEndianness || 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) M.getPointerSize() != Module::AnyPointerSize) 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 0; // Match for some other target 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(__sparc__) 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 10; 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#else 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 0; 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SparcTargetMachine::addInstSelector(PassManagerBase &PM, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CodeGenOpt::Level OptLevel) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PM.add(createSparcISelDag(*this)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// addPreEmitPass - This pass may be implemented by targets that want to run 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// passes immediately before machine code is emitted. This should return 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)/// true if -print-machineinstrs should print out the code after the passes. 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SparcTargetMachine::addPreEmitPass(PassManagerBase &PM, 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CodeGenOpt::Level OptLevel){ 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PM.add(createSparcFPMoverPass(*this)); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PM.add(createSparcDelaySlotFillerPass(*this)); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool SparcTargetMachine::addAssemblyEmitter(PassManagerBase &PM, 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CodeGenOpt::Level OptLevel, 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool Verbose, 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) formatted_raw_ostream &Out) { 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Output assembly language. 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assert(AsmPrinterCtor && "AsmPrinter was not linked in"); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (AsmPrinterCtor) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PM.add(AsmPrinterCtor(Out, *this, Verbose)); 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)