xref: /openbsd-src/gnu/llvm/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
109467b48Spatrick //===-- WebAssemblyMCTargetDesc.cpp - WebAssembly Target Descriptions -----===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick ///
909467b48Spatrick /// \file
1009467b48Spatrick /// This file provides WebAssembly-specific target descriptions.
1109467b48Spatrick ///
1209467b48Spatrick //===----------------------------------------------------------------------===//
1309467b48Spatrick 
1409467b48Spatrick #include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
1509467b48Spatrick #include "MCTargetDesc/WebAssemblyInstPrinter.h"
1609467b48Spatrick #include "MCTargetDesc/WebAssemblyMCAsmInfo.h"
1709467b48Spatrick #include "MCTargetDesc/WebAssemblyTargetStreamer.h"
1809467b48Spatrick #include "TargetInfo/WebAssemblyTargetInfo.h"
1909467b48Spatrick #include "llvm/MC/MCInstrInfo.h"
2009467b48Spatrick #include "llvm/MC/MCRegisterInfo.h"
2109467b48Spatrick #include "llvm/MC/MCSubtargetInfo.h"
22*d415bd75Srobert #include "llvm/MC/TargetRegistry.h"
2309467b48Spatrick #include "llvm/Support/ErrorHandling.h"
2409467b48Spatrick using namespace llvm;
2509467b48Spatrick 
2609467b48Spatrick #define DEBUG_TYPE "wasm-mc-target-desc"
2709467b48Spatrick 
2809467b48Spatrick #define GET_INSTRINFO_MC_DESC
29*d415bd75Srobert #define ENABLE_INSTR_PREDICATE_VERIFIER
3009467b48Spatrick #include "WebAssemblyGenInstrInfo.inc"
3109467b48Spatrick 
3209467b48Spatrick #define GET_SUBTARGETINFO_MC_DESC
3309467b48Spatrick #include "WebAssemblyGenSubtargetInfo.inc"
3409467b48Spatrick 
3509467b48Spatrick #define GET_REGINFO_MC_DESC
3609467b48Spatrick #include "WebAssemblyGenRegisterInfo.inc"
3709467b48Spatrick 
createMCAsmInfo(const MCRegisterInfo &,const Triple & TT,const MCTargetOptions & Options)3809467b48Spatrick static MCAsmInfo *createMCAsmInfo(const MCRegisterInfo & /*MRI*/,
3909467b48Spatrick                                   const Triple &TT,
4009467b48Spatrick                                   const MCTargetOptions &Options) {
4109467b48Spatrick   return new WebAssemblyMCAsmInfo(TT, Options);
4209467b48Spatrick }
4309467b48Spatrick 
createMCInstrInfo()4409467b48Spatrick static MCInstrInfo *createMCInstrInfo() {
4509467b48Spatrick   auto *X = new MCInstrInfo();
4609467b48Spatrick   InitWebAssemblyMCInstrInfo(X);
4709467b48Spatrick   return X;
4809467b48Spatrick }
4909467b48Spatrick 
createMCRegisterInfo(const Triple &)5009467b48Spatrick static MCRegisterInfo *createMCRegisterInfo(const Triple & /*T*/) {
5109467b48Spatrick   auto *X = new MCRegisterInfo();
5209467b48Spatrick   InitWebAssemblyMCRegisterInfo(X, 0);
5309467b48Spatrick   return X;
5409467b48Spatrick }
5509467b48Spatrick 
createMCInstPrinter(const Triple &,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)5609467b48Spatrick static MCInstPrinter *createMCInstPrinter(const Triple & /*T*/,
5709467b48Spatrick                                           unsigned SyntaxVariant,
5809467b48Spatrick                                           const MCAsmInfo &MAI,
5909467b48Spatrick                                           const MCInstrInfo &MII,
6009467b48Spatrick                                           const MCRegisterInfo &MRI) {
6109467b48Spatrick   assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant");
6209467b48Spatrick   return new WebAssemblyInstPrinter(MAI, MII, MRI);
6309467b48Spatrick }
6409467b48Spatrick 
createCodeEmitter(const MCInstrInfo & MCII,MCContext & Ctx)6509467b48Spatrick static MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII,
6609467b48Spatrick                                         MCContext &Ctx) {
6709467b48Spatrick   return createWebAssemblyMCCodeEmitter(MCII);
6809467b48Spatrick }
6909467b48Spatrick 
createAsmBackend(const Target &,const MCSubtargetInfo & STI,const MCRegisterInfo &,const MCTargetOptions &)7009467b48Spatrick static MCAsmBackend *createAsmBackend(const Target & /*T*/,
7109467b48Spatrick                                       const MCSubtargetInfo &STI,
7209467b48Spatrick                                       const MCRegisterInfo & /*MRI*/,
7309467b48Spatrick                                       const MCTargetOptions & /*Options*/) {
7409467b48Spatrick   return createWebAssemblyAsmBackend(STI.getTargetTriple());
7509467b48Spatrick }
7609467b48Spatrick 
createMCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)7709467b48Spatrick static MCSubtargetInfo *createMCSubtargetInfo(const Triple &TT, StringRef CPU,
7809467b48Spatrick                                               StringRef FS) {
7973471bf0Spatrick   return createWebAssemblyMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
8009467b48Spatrick }
8109467b48Spatrick 
8209467b48Spatrick static MCTargetStreamer *
createObjectTargetStreamer(MCStreamer & S,const MCSubtargetInfo & STI)8309467b48Spatrick createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
8409467b48Spatrick   return new WebAssemblyTargetWasmStreamer(S);
8509467b48Spatrick }
8609467b48Spatrick 
createAsmTargetStreamer(MCStreamer & S,formatted_raw_ostream & OS,MCInstPrinter *,bool)8709467b48Spatrick static MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
8809467b48Spatrick                                                  formatted_raw_ostream &OS,
8909467b48Spatrick                                                  MCInstPrinter * /*InstPrint*/,
9009467b48Spatrick                                                  bool /*isVerboseAsm*/) {
9109467b48Spatrick   return new WebAssemblyTargetAsmStreamer(S, OS);
9209467b48Spatrick }
9309467b48Spatrick 
createNullTargetStreamer(MCStreamer & S)9409467b48Spatrick static MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) {
9509467b48Spatrick   return new WebAssemblyTargetNullStreamer(S);
9609467b48Spatrick }
9709467b48Spatrick 
9809467b48Spatrick // Force static initialization.
LLVMInitializeWebAssemblyTargetMC()9909467b48Spatrick extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTargetMC() {
10009467b48Spatrick   for (Target *T :
10109467b48Spatrick        {&getTheWebAssemblyTarget32(), &getTheWebAssemblyTarget64()}) {
10209467b48Spatrick     // Register the MC asm info.
10309467b48Spatrick     RegisterMCAsmInfoFn X(*T, createMCAsmInfo);
10409467b48Spatrick 
10509467b48Spatrick     // Register the MC instruction info.
10609467b48Spatrick     TargetRegistry::RegisterMCInstrInfo(*T, createMCInstrInfo);
10709467b48Spatrick 
10809467b48Spatrick     // Register the MC register info.
10909467b48Spatrick     TargetRegistry::RegisterMCRegInfo(*T, createMCRegisterInfo);
11009467b48Spatrick 
11109467b48Spatrick     // Register the MCInstPrinter.
11209467b48Spatrick     TargetRegistry::RegisterMCInstPrinter(*T, createMCInstPrinter);
11309467b48Spatrick 
11409467b48Spatrick     // Register the MC code emitter.
11509467b48Spatrick     TargetRegistry::RegisterMCCodeEmitter(*T, createCodeEmitter);
11609467b48Spatrick 
11709467b48Spatrick     // Register the ASM Backend.
11809467b48Spatrick     TargetRegistry::RegisterMCAsmBackend(*T, createAsmBackend);
11909467b48Spatrick 
12009467b48Spatrick     // Register the MC subtarget info.
12109467b48Spatrick     TargetRegistry::RegisterMCSubtargetInfo(*T, createMCSubtargetInfo);
12209467b48Spatrick 
12309467b48Spatrick     // Register the object target streamer.
12409467b48Spatrick     TargetRegistry::RegisterObjectTargetStreamer(*T,
12509467b48Spatrick                                                  createObjectTargetStreamer);
12609467b48Spatrick     // Register the asm target streamer.
12709467b48Spatrick     TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer);
12809467b48Spatrick     // Register the null target streamer.
12909467b48Spatrick     TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer);
13009467b48Spatrick   }
13109467b48Spatrick }
132