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)