WebAssemblyMCTargetDesc.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //===-- WebAssemblyMCTargetDesc.cpp - WebAssembly 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. /// \file
  10. /// This file provides WebAssembly-specific target descriptions.
  11. ///
  12. //===----------------------------------------------------------------------===//
  13. #include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
  14. #include "MCTargetDesc/WebAssemblyInstPrinter.h"
  15. #include "MCTargetDesc/WebAssemblyMCAsmInfo.h"
  16. #include "MCTargetDesc/WebAssemblyTargetStreamer.h"
  17. #include "TargetInfo/WebAssemblyTargetInfo.h"
  18. #include "llvm/MC/MCInstrInfo.h"
  19. #include "llvm/MC/MCRegisterInfo.h"
  20. #include "llvm/MC/MCSubtargetInfo.h"
  21. #include "llvm/MC/TargetRegistry.h"
  22. #include "llvm/Support/ErrorHandling.h"
  23. using namespace llvm;
  24. #define DEBUG_TYPE "wasm-mc-target-desc"
  25. #define GET_INSTRINFO_MC_DESC
  26. #define ENABLE_INSTR_PREDICATE_VERIFIER
  27. #include "WebAssemblyGenInstrInfo.inc"
  28. #define GET_SUBTARGETINFO_MC_DESC
  29. #include "WebAssemblyGenSubtargetInfo.inc"
  30. #define GET_REGINFO_MC_DESC
  31. #include "WebAssemblyGenRegisterInfo.inc"
  32. static MCAsmInfo *createMCAsmInfo(const MCRegisterInfo & /*MRI*/,
  33. const Triple &TT,
  34. const MCTargetOptions &Options) {
  35. return new WebAssemblyMCAsmInfo(TT, Options);
  36. }
  37. static MCInstrInfo *createMCInstrInfo() {
  38. auto *X = new MCInstrInfo();
  39. InitWebAssemblyMCInstrInfo(X);
  40. return X;
  41. }
  42. static MCRegisterInfo *createMCRegisterInfo(const Triple & /*T*/) {
  43. auto *X = new MCRegisterInfo();
  44. InitWebAssemblyMCRegisterInfo(X, 0);
  45. return X;
  46. }
  47. static MCInstPrinter *createMCInstPrinter(const Triple & /*T*/,
  48. unsigned SyntaxVariant,
  49. const MCAsmInfo &MAI,
  50. const MCInstrInfo &MII,
  51. const MCRegisterInfo &MRI) {
  52. assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant");
  53. return new WebAssemblyInstPrinter(MAI, MII, MRI);
  54. }
  55. static MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII,
  56. MCContext &Ctx) {
  57. return createWebAssemblyMCCodeEmitter(MCII);
  58. }
  59. static MCAsmBackend *createAsmBackend(const Target & /*T*/,
  60. const MCSubtargetInfo &STI,
  61. const MCRegisterInfo & /*MRI*/,
  62. const MCTargetOptions & /*Options*/) {
  63. return createWebAssemblyAsmBackend(STI.getTargetTriple());
  64. }
  65. static MCSubtargetInfo *createMCSubtargetInfo(const Triple &TT, StringRef CPU,
  66. StringRef FS) {
  67. return createWebAssemblyMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
  68. }
  69. static MCTargetStreamer *
  70. createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
  71. return new WebAssemblyTargetWasmStreamer(S);
  72. }
  73. static MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
  74. formatted_raw_ostream &OS,
  75. MCInstPrinter * /*InstPrint*/,
  76. bool /*isVerboseAsm*/) {
  77. return new WebAssemblyTargetAsmStreamer(S, OS);
  78. }
  79. static MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) {
  80. return new WebAssemblyTargetNullStreamer(S);
  81. }
  82. // Force static initialization.
  83. extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTargetMC() {
  84. for (Target *T :
  85. {&getTheWebAssemblyTarget32(), &getTheWebAssemblyTarget64()}) {
  86. // Register the MC asm info.
  87. RegisterMCAsmInfoFn X(*T, createMCAsmInfo);
  88. // Register the MC instruction info.
  89. TargetRegistry::RegisterMCInstrInfo(*T, createMCInstrInfo);
  90. // Register the MC register info.
  91. TargetRegistry::RegisterMCRegInfo(*T, createMCRegisterInfo);
  92. // Register the MCInstPrinter.
  93. TargetRegistry::RegisterMCInstPrinter(*T, createMCInstPrinter);
  94. // Register the MC code emitter.
  95. TargetRegistry::RegisterMCCodeEmitter(*T, createCodeEmitter);
  96. // Register the ASM Backend.
  97. TargetRegistry::RegisterMCAsmBackend(*T, createAsmBackend);
  98. // Register the MC subtarget info.
  99. TargetRegistry::RegisterMCSubtargetInfo(*T, createMCSubtargetInfo);
  100. // Register the object target streamer.
  101. TargetRegistry::RegisterObjectTargetStreamer(*T,
  102. createObjectTargetStreamer);
  103. // Register the asm target streamer.
  104. TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer);
  105. // Register the null target streamer.
  106. TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer);
  107. }
  108. }