xref: /aosp_15_r20/external/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- WebAssemblyMCTargetDesc.cpp - WebAssembly Target Descriptions -----===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker ///
10*9880d681SAndroid Build Coastguard Worker /// \file
11*9880d681SAndroid Build Coastguard Worker /// \brief This file provides WebAssembly-specific target descriptions.
12*9880d681SAndroid Build Coastguard Worker ///
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyMCTargetDesc.h"
16*9880d681SAndroid Build Coastguard Worker #include "InstPrinter/WebAssemblyInstPrinter.h"
17*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyMCAsmInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyTargetStreamer.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "wasm-mc-target-desc"
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_MC_DESC
29*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyGenInstrInfo.inc"
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_MC_DESC
32*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyGenSubtargetInfo.inc"
33*9880d681SAndroid Build Coastguard Worker 
34*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_MC_DESC
35*9880d681SAndroid Build Coastguard Worker #include "WebAssemblyGenRegisterInfo.inc"
36*9880d681SAndroid Build Coastguard Worker 
createMCAsmInfo(const MCRegisterInfo &,const Triple & TT)37*9880d681SAndroid Build Coastguard Worker static MCAsmInfo *createMCAsmInfo(const MCRegisterInfo & /*MRI*/,
38*9880d681SAndroid Build Coastguard Worker                                   const Triple &TT) {
39*9880d681SAndroid Build Coastguard Worker   return new WebAssemblyMCAsmInfo(TT);
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker 
adjustCodeGenOpts(const Triple &,Reloc::Model,CodeModel::Model & CM)42*9880d681SAndroid Build Coastguard Worker static void adjustCodeGenOpts(const Triple & /*TT*/, Reloc::Model /*RM*/,
43*9880d681SAndroid Build Coastguard Worker                               CodeModel::Model &CM) {
44*9880d681SAndroid Build Coastguard Worker   CodeModel::Model M = (CM == CodeModel::Default || CM == CodeModel::JITDefault)
45*9880d681SAndroid Build Coastguard Worker                            ? CodeModel::Large
46*9880d681SAndroid Build Coastguard Worker                            : CM;
47*9880d681SAndroid Build Coastguard Worker   if (M != CodeModel::Large)
48*9880d681SAndroid Build Coastguard Worker     report_fatal_error("Non-large code models are not supported yet");
49*9880d681SAndroid Build Coastguard Worker }
50*9880d681SAndroid Build Coastguard Worker 
createMCInstrInfo()51*9880d681SAndroid Build Coastguard Worker static MCInstrInfo *createMCInstrInfo() {
52*9880d681SAndroid Build Coastguard Worker   MCInstrInfo *X = new MCInstrInfo();
53*9880d681SAndroid Build Coastguard Worker   InitWebAssemblyMCInstrInfo(X);
54*9880d681SAndroid Build Coastguard Worker   return X;
55*9880d681SAndroid Build Coastguard Worker }
56*9880d681SAndroid Build Coastguard Worker 
createMCRegisterInfo(const Triple &)57*9880d681SAndroid Build Coastguard Worker static MCRegisterInfo *createMCRegisterInfo(const Triple & /*T*/) {
58*9880d681SAndroid Build Coastguard Worker   MCRegisterInfo *X = new MCRegisterInfo();
59*9880d681SAndroid Build Coastguard Worker   InitWebAssemblyMCRegisterInfo(X, 0);
60*9880d681SAndroid Build Coastguard Worker   return X;
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker 
createMCInstPrinter(const Triple &,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)63*9880d681SAndroid Build Coastguard Worker static MCInstPrinter *createMCInstPrinter(const Triple & /*T*/,
64*9880d681SAndroid Build Coastguard Worker                                           unsigned SyntaxVariant,
65*9880d681SAndroid Build Coastguard Worker                                           const MCAsmInfo &MAI,
66*9880d681SAndroid Build Coastguard Worker                                           const MCInstrInfo &MII,
67*9880d681SAndroid Build Coastguard Worker                                           const MCRegisterInfo &MRI) {
68*9880d681SAndroid Build Coastguard Worker   assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant");
69*9880d681SAndroid Build Coastguard Worker   return new WebAssemblyInstPrinter(MAI, MII, MRI);
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker 
createCodeEmitter(const MCInstrInfo & MCII,const MCRegisterInfo &,MCContext &)72*9880d681SAndroid Build Coastguard Worker static MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII,
73*9880d681SAndroid Build Coastguard Worker                                         const MCRegisterInfo & /*MRI*/,
74*9880d681SAndroid Build Coastguard Worker                                         MCContext & /*Ctx*/) {
75*9880d681SAndroid Build Coastguard Worker   return createWebAssemblyMCCodeEmitter(MCII);
76*9880d681SAndroid Build Coastguard Worker }
77*9880d681SAndroid Build Coastguard Worker 
createAsmBackend(const Target &,const MCRegisterInfo &,const Triple & TT,StringRef)78*9880d681SAndroid Build Coastguard Worker static MCAsmBackend *createAsmBackend(const Target & /*T*/,
79*9880d681SAndroid Build Coastguard Worker                                       const MCRegisterInfo & /*MRI*/,
80*9880d681SAndroid Build Coastguard Worker                                       const Triple &TT, StringRef /*CPU*/) {
81*9880d681SAndroid Build Coastguard Worker   return createWebAssemblyAsmBackend(TT);
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker 
createMCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)84*9880d681SAndroid Build Coastguard Worker static MCSubtargetInfo *createMCSubtargetInfo(const Triple &TT, StringRef CPU,
85*9880d681SAndroid Build Coastguard Worker                                               StringRef FS) {
86*9880d681SAndroid Build Coastguard Worker   return createWebAssemblyMCSubtargetInfoImpl(TT, CPU, FS);
87*9880d681SAndroid Build Coastguard Worker }
88*9880d681SAndroid Build Coastguard Worker 
89*9880d681SAndroid Build Coastguard Worker static MCTargetStreamer *
createObjectTargetStreamer(MCStreamer & S,const MCSubtargetInfo &)90*9880d681SAndroid Build Coastguard Worker createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo & /*STI*/) {
91*9880d681SAndroid Build Coastguard Worker   return new WebAssemblyTargetELFStreamer(S);
92*9880d681SAndroid Build Coastguard Worker }
93*9880d681SAndroid Build Coastguard Worker 
createAsmTargetStreamer(MCStreamer & S,formatted_raw_ostream & OS,MCInstPrinter *,bool)94*9880d681SAndroid Build Coastguard Worker static MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
95*9880d681SAndroid Build Coastguard Worker                                                  formatted_raw_ostream &OS,
96*9880d681SAndroid Build Coastguard Worker                                                  MCInstPrinter * /*InstPrint*/,
97*9880d681SAndroid Build Coastguard Worker                                                  bool /*isVerboseAsm*/) {
98*9880d681SAndroid Build Coastguard Worker   return new WebAssemblyTargetAsmStreamer(S, OS);
99*9880d681SAndroid Build Coastguard Worker }
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker // Force static initialization.
LLVMInitializeWebAssemblyTargetMC()102*9880d681SAndroid Build Coastguard Worker extern "C" void LLVMInitializeWebAssemblyTargetMC() {
103*9880d681SAndroid Build Coastguard Worker   for (Target *T : {&TheWebAssemblyTarget32, &TheWebAssemblyTarget64}) {
104*9880d681SAndroid Build Coastguard Worker     // Register the MC asm info.
105*9880d681SAndroid Build Coastguard Worker     RegisterMCAsmInfoFn X(*T, createMCAsmInfo);
106*9880d681SAndroid Build Coastguard Worker 
107*9880d681SAndroid Build Coastguard Worker     // Register the MC instruction info.
108*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCInstrInfo(*T, createMCInstrInfo);
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker     // Register the MC codegen info.
111*9880d681SAndroid Build Coastguard Worker     TargetRegistry::registerMCAdjustCodeGenOpts(*T, adjustCodeGenOpts);
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker     // Register the MC register info.
114*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCRegInfo(*T, createMCRegisterInfo);
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker     // Register the MCInstPrinter.
117*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCInstPrinter(*T, createMCInstPrinter);
118*9880d681SAndroid Build Coastguard Worker 
119*9880d681SAndroid Build Coastguard Worker     // Register the MC code emitter.
120*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCCodeEmitter(*T, createCodeEmitter);
121*9880d681SAndroid Build Coastguard Worker 
122*9880d681SAndroid Build Coastguard Worker     // Register the ASM Backend.
123*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCAsmBackend(*T, createAsmBackend);
124*9880d681SAndroid Build Coastguard Worker 
125*9880d681SAndroid Build Coastguard Worker     // Register the MC subtarget info.
126*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCSubtargetInfo(*T, createMCSubtargetInfo);
127*9880d681SAndroid Build Coastguard Worker 
128*9880d681SAndroid Build Coastguard Worker     // Register the object target streamer.
129*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterObjectTargetStreamer(*T,
130*9880d681SAndroid Build Coastguard Worker                                                  createObjectTargetStreamer);
131*9880d681SAndroid Build Coastguard Worker     // Register the asm target streamer.
132*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer);
133*9880d681SAndroid Build Coastguard Worker   }
134*9880d681SAndroid Build Coastguard Worker }
135