BPFMCTargetDesc.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. //===-- BPFMCTargetDesc.cpp - BPF Target Descriptions ---------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file provides BPF specific target descriptions.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "MCTargetDesc/BPFMCTargetDesc.h"
  13. #include "MCTargetDesc/BPFInstPrinter.h"
  14. #include "MCTargetDesc/BPFMCAsmInfo.h"
  15. #include "TargetInfo/BPFTargetInfo.h"
  16. #include "llvm/MC/MCInstrAnalysis.h"
  17. #include "llvm/MC/MCInstrInfo.h"
  18. #include "llvm/MC/MCRegisterInfo.h"
  19. #include "llvm/MC/MCSubtargetInfo.h"
  20. #include "llvm/MC/TargetRegistry.h"
  21. #include "llvm/Support/Host.h"
  22. #define GET_INSTRINFO_MC_DESC
  23. #define ENABLE_INSTR_PREDICATE_VERIFIER
  24. #include "BPFGenInstrInfo.inc"
  25. #define GET_SUBTARGETINFO_MC_DESC
  26. #include "BPFGenSubtargetInfo.inc"
  27. #define GET_REGINFO_MC_DESC
  28. #include "BPFGenRegisterInfo.inc"
  29. using namespace llvm;
  30. static MCInstrInfo *createBPFMCInstrInfo() {
  31. MCInstrInfo *X = new MCInstrInfo();
  32. InitBPFMCInstrInfo(X);
  33. return X;
  34. }
  35. static MCRegisterInfo *createBPFMCRegisterInfo(const Triple &TT) {
  36. MCRegisterInfo *X = new MCRegisterInfo();
  37. InitBPFMCRegisterInfo(X, BPF::R11 /* RAReg doesn't exist */);
  38. return X;
  39. }
  40. static MCSubtargetInfo *createBPFMCSubtargetInfo(const Triple &TT,
  41. StringRef CPU, StringRef FS) {
  42. return createBPFMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
  43. }
  44. static MCStreamer *createBPFMCStreamer(const Triple &T, MCContext &Ctx,
  45. std::unique_ptr<MCAsmBackend> &&MAB,
  46. std::unique_ptr<MCObjectWriter> &&OW,
  47. std::unique_ptr<MCCodeEmitter> &&Emitter,
  48. bool RelaxAll) {
  49. return createELFStreamer(Ctx, std::move(MAB), std::move(OW), std::move(Emitter),
  50. RelaxAll);
  51. }
  52. static MCInstPrinter *createBPFMCInstPrinter(const Triple &T,
  53. unsigned SyntaxVariant,
  54. const MCAsmInfo &MAI,
  55. const MCInstrInfo &MII,
  56. const MCRegisterInfo &MRI) {
  57. if (SyntaxVariant == 0)
  58. return new BPFInstPrinter(MAI, MII, MRI);
  59. return nullptr;
  60. }
  61. namespace {
  62. class BPFMCInstrAnalysis : public MCInstrAnalysis {
  63. public:
  64. explicit BPFMCInstrAnalysis(const MCInstrInfo *Info)
  65. : MCInstrAnalysis(Info) {}
  66. bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
  67. uint64_t &Target) const override {
  68. // The target is the 3rd operand of cond inst and the 1st of uncond inst.
  69. int16_t Imm;
  70. if (isConditionalBranch(Inst)) {
  71. Imm = Inst.getOperand(2).getImm();
  72. } else if (isUnconditionalBranch(Inst))
  73. Imm = Inst.getOperand(0).getImm();
  74. else
  75. return false;
  76. Target = Addr + Size + Imm * Size;
  77. return true;
  78. }
  79. };
  80. } // end anonymous namespace
  81. static MCInstrAnalysis *createBPFInstrAnalysis(const MCInstrInfo *Info) {
  82. return new BPFMCInstrAnalysis(Info);
  83. }
  84. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTargetMC() {
  85. for (Target *T :
  86. {&getTheBPFleTarget(), &getTheBPFbeTarget(), &getTheBPFTarget()}) {
  87. // Register the MC asm info.
  88. RegisterMCAsmInfo<BPFMCAsmInfo> X(*T);
  89. // Register the MC instruction info.
  90. TargetRegistry::RegisterMCInstrInfo(*T, createBPFMCInstrInfo);
  91. // Register the MC register info.
  92. TargetRegistry::RegisterMCRegInfo(*T, createBPFMCRegisterInfo);
  93. // Register the MC subtarget info.
  94. TargetRegistry::RegisterMCSubtargetInfo(*T,
  95. createBPFMCSubtargetInfo);
  96. // Register the object streamer
  97. TargetRegistry::RegisterELFStreamer(*T, createBPFMCStreamer);
  98. // Register the MCInstPrinter.
  99. TargetRegistry::RegisterMCInstPrinter(*T, createBPFMCInstPrinter);
  100. // Register the MC instruction analyzer.
  101. TargetRegistry::RegisterMCInstrAnalysis(*T, createBPFInstrAnalysis);
  102. }
  103. // Register the MC code emitter
  104. TargetRegistry::RegisterMCCodeEmitter(getTheBPFleTarget(),
  105. createBPFMCCodeEmitter);
  106. TargetRegistry::RegisterMCCodeEmitter(getTheBPFbeTarget(),
  107. createBPFbeMCCodeEmitter);
  108. // Register the ASM Backend
  109. TargetRegistry::RegisterMCAsmBackend(getTheBPFleTarget(),
  110. createBPFAsmBackend);
  111. TargetRegistry::RegisterMCAsmBackend(getTheBPFbeTarget(),
  112. createBPFbeAsmBackend);
  113. if (sys::IsLittleEndianHost) {
  114. TargetRegistry::RegisterMCCodeEmitter(getTheBPFTarget(),
  115. createBPFMCCodeEmitter);
  116. TargetRegistry::RegisterMCAsmBackend(getTheBPFTarget(),
  117. createBPFAsmBackend);
  118. } else {
  119. TargetRegistry::RegisterMCCodeEmitter(getTheBPFTarget(),
  120. createBPFbeMCCodeEmitter);
  121. TargetRegistry::RegisterMCAsmBackend(getTheBPFTarget(),
  122. createBPFbeAsmBackend);
  123. }
  124. }