AlphaTargetMachine.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //===-- AlphaTargetMachine.cpp - Define TargetMachine for Alpha -----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "Alpha.h"
  13. #include "AlphaJITInfo.h"
  14. #include "AlphaTargetAsmInfo.h"
  15. #include "AlphaTargetMachine.h"
  16. #include "llvm/Module.h"
  17. #include "llvm/PassManager.h"
  18. #include "llvm/Target/TargetMachineRegistry.h"
  19. #include "llvm/Support/raw_ostream.h"
  20. using namespace llvm;
  21. // Register the targets
  22. static RegisterTarget<AlphaTargetMachine> X("alpha", "Alpha [experimental]");
  23. // No assembler printer by default
  24. AlphaTargetMachine::AsmPrinterCtorFn AlphaTargetMachine::AsmPrinterCtor = 0;
  25. // Force static initialization.
  26. extern "C" void LLVMInitializeAlphaTarget() { }
  27. const TargetAsmInfo *AlphaTargetMachine::createTargetAsmInfo() const {
  28. return new AlphaTargetAsmInfo(*this);
  29. }
  30. unsigned AlphaTargetMachine::getModuleMatchQuality(const Module &M) {
  31. // We strongly match "alpha*".
  32. std::string TT = M.getTargetTriple();
  33. if (TT.size() >= 5 && TT[0] == 'a' && TT[1] == 'l' && TT[2] == 'p' &&
  34. TT[3] == 'h' && TT[4] == 'a')
  35. return 20;
  36. // If the target triple is something non-alpha, we don't match.
  37. if (!TT.empty()) return 0;
  38. if (M.getEndianness() == Module::LittleEndian &&
  39. M.getPointerSize() == Module::Pointer64)
  40. return 10; // Weak match
  41. else if (M.getEndianness() != Module::AnyEndianness ||
  42. M.getPointerSize() != Module::AnyPointerSize)
  43. return 0; // Match for some other target
  44. return getJITMatchQuality()/2;
  45. }
  46. unsigned AlphaTargetMachine::getJITMatchQuality() {
  47. #ifdef __alpha
  48. return 10;
  49. #else
  50. return 0;
  51. #endif
  52. }
  53. AlphaTargetMachine::AlphaTargetMachine(const Module &M, const std::string &FS)
  54. : DataLayout("e-f128:128:128"),
  55. FrameInfo(TargetFrameInfo::StackGrowsDown, 16, 0),
  56. JITInfo(*this),
  57. Subtarget(M, FS),
  58. TLInfo(*this) {
  59. setRelocationModel(Reloc::PIC_);
  60. }
  61. //===----------------------------------------------------------------------===//
  62. // Pass Pipeline Configuration
  63. //===----------------------------------------------------------------------===//
  64. bool AlphaTargetMachine::addInstSelector(PassManagerBase &PM,
  65. CodeGenOpt::Level OptLevel) {
  66. PM.add(createAlphaISelDag(*this));
  67. return false;
  68. }
  69. bool AlphaTargetMachine::addPreEmitPass(PassManagerBase &PM,
  70. CodeGenOpt::Level OptLevel) {
  71. // Must run branch selection immediately preceding the asm printer
  72. PM.add(createAlphaBranchSelectionPass());
  73. return false;
  74. }
  75. bool AlphaTargetMachine::addAssemblyEmitter(PassManagerBase &PM,
  76. CodeGenOpt::Level OptLevel,
  77. bool Verbose,
  78. raw_ostream &Out) {
  79. PM.add(createAlphaLLRPPass(*this));
  80. // Output assembly language.
  81. assert(AsmPrinterCtor && "AsmPrinter was not linked in");
  82. if (AsmPrinterCtor)
  83. PM.add(AsmPrinterCtor(Out, *this, OptLevel, Verbose));
  84. return false;
  85. }
  86. bool AlphaTargetMachine::addCodeEmitter(PassManagerBase &PM,
  87. CodeGenOpt::Level OptLevel,
  88. bool DumpAsm, MachineCodeEmitter &MCE) {
  89. PM.add(createAlphaCodeEmitterPass(*this, MCE));
  90. if (DumpAsm) {
  91. assert(AsmPrinterCtor && "AsmPrinter was not linked in");
  92. if (AsmPrinterCtor)
  93. PM.add(AsmPrinterCtor(errs(), *this, OptLevel, true));
  94. }
  95. return false;
  96. }
  97. bool AlphaTargetMachine::addCodeEmitter(PassManagerBase &PM,
  98. CodeGenOpt::Level OptLevel,
  99. bool DumpAsm, JITCodeEmitter &JCE) {
  100. PM.add(createAlphaJITCodeEmitterPass(*this, JCE));
  101. if (DumpAsm) {
  102. assert(AsmPrinterCtor && "AsmPrinter was not linked in");
  103. if (AsmPrinterCtor)
  104. PM.add(AsmPrinterCtor(errs(), *this, OptLevel, true));
  105. }
  106. return false;
  107. }
  108. bool AlphaTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM,
  109. CodeGenOpt::Level OptLevel,
  110. bool DumpAsm,
  111. MachineCodeEmitter &MCE) {
  112. return addCodeEmitter(PM, OptLevel, DumpAsm, MCE);
  113. }
  114. bool AlphaTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM,
  115. CodeGenOpt::Level OptLevel,
  116. bool DumpAsm,
  117. JITCodeEmitter &JCE) {
  118. return addCodeEmitter(PM, OptLevel, DumpAsm, JCE);
  119. }