SparcTargetMachine.cpp revision 2e9d5f912a9841d3685ba0241abe1131943fed29
15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner//===-- SparcTargetMachine.cpp - Define TargetMachine for Sparc -----------===// 25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// 35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// The LLVM Compiler Infrastructure 45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// 55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// This file is distributed under the University of Illinois Open Source 65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// License. See LICENSE.TXT for details. 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner//===----------------------------------------------------------------------===// 95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// 1034c48ff1e3ad5cd2084ca40188754d45f423750bDavid 'Digit' Turner// 11e1e03df288d5a44bfbffbd86588395c7cbbc27dfDavid 'Digit' Turner//===----------------------------------------------------------------------===// 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "SparcTargetAsmInfo.h" 145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "SparcTargetMachine.h" 15aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner#include "Sparc.h" 165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Module.h" 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/PassManager.h" 185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "llvm/Target/TargetMachineRegistry.h" 195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerusing namespace llvm; 205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 21bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner/// SparcTargetMachineModule - Note that this is used on hosts that 22bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner/// cannot link in a library unless there are references into the 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// library. In particular, it seems that it is not possible to get 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// things to work on Win32 without this. Though it is unused, do not 255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// remove it. 26aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turnerextern "C" int SparcTargetMachineModule; 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint SparcTargetMachineModule = 0; 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner// Register the target. 305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic RegisterTarget<SparcTargetMachine> X("sparc", "SPARC"); 315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerconst TargetAsmInfo *SparcTargetMachine::createTargetAsmInfo() const { 335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // FIXME: Handle Solaris subtarget someday :) 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return new SparcELFTargetAsmInfo(*this); 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 36aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// SparcTargetMachine ctor - Create an ILP32 architecture model 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// 395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerSparcTargetMachine::SparcTargetMachine(const Module &M, const std::string &FS) 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner : DataLayout("E-p:32:32-f128:128:128"), 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner Subtarget(M, FS), TLInfo(*this), InstrInfo(Subtarget), 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0) { 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerunsigned SparcTargetMachine::getModuleMatchQuality(const Module &M) { 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner std::string TT = M.getTargetTriple(); 47bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "sparc-") 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 20; 495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // If the target triple is something non-sparc, we don't match. 515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (!TT.empty()) return 0; 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner if (M.getEndianness() == Module::BigEndian && 545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner M.getPointerSize() == Module::Pointer32) 555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifdef __sparc__ 565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 20; // BE/32 ==> Prefer sparc on sparc 575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 5; // BE/32 ==> Prefer ppc elsewhere 595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner else if (M.getEndianness() != Module::AnyEndianness || 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner M.getPointerSize() != Module::AnyPointerSize) 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; // Match for some other target 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(__sparc__) 655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 10; 665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#else 675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerbool SparcTargetMachine::addInstSelector(PassManagerBase &PM, 725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unsigned OptLevel) { 735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createSparcISelDag(*this)); 745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return false; 755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// addPreEmitPass - This pass may be implemented by targets that want to run 785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// passes immediately before machine code is emitted. This should return 795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/// true if -print-machineinstrs should print out the code after the passes. 805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerbool SparcTargetMachine::addPreEmitPass(PassManagerBase &PM, unsigned OptLevel){ 815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createSparcFPMoverPass(*this)); 825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createSparcDelaySlotFillerPass(*this)); 835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return true; 845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 85bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner 865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerbool SparcTargetMachine::addAssemblyEmitter(PassManagerBase &PM, 875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner unsigned OptLevel, 885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bool Verbose, 895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner raw_ostream &Out) { 905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // Output assembly language. 915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner PM.add(createSparcCodePrinterPass(Out, *this, OptLevel, Verbose)); 925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return false; 935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner