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