| //===-- WebAssemblyMCTargetDesc.cpp - WebAssembly Target Descriptions -----===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// This file provides WebAssembly-specific target descriptions. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" | |
| #include "MCTargetDesc/WebAssemblyInstPrinter.h" | |
| #include "MCTargetDesc/WebAssemblyMCAsmInfo.h" | |
| #include "MCTargetDesc/WebAssemblyTargetStreamer.h" | |
| #include "TargetInfo/WebAssemblyTargetInfo.h" | |
| #include "llvm/MC/MCInstrInfo.h" | |
| #include "llvm/MC/MCRegisterInfo.h" | |
| #include "llvm/MC/MCSubtargetInfo.h" | |
| #include "llvm/Support/ErrorHandling.h" | |
| #include "llvm/Support/TargetRegistry.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "wasm-mc-target-desc" | |
| #define GET_INSTRINFO_MC_DESC | |
| #include "WebAssemblyGenInstrInfo.inc" | |
| #define GET_SUBTARGETINFO_MC_DESC | |
| #include "WebAssemblyGenSubtargetInfo.inc" | |
| #define GET_REGINFO_MC_DESC | |
| #include "WebAssemblyGenRegisterInfo.inc" | |
| static MCAsmInfo *createMCAsmInfo(const MCRegisterInfo & /*MRI*/, | |
| const Triple &TT, | |
| const MCTargetOptions &Options) { | |
| return new WebAssemblyMCAsmInfo(TT, Options); | |
| } | |
| static MCInstrInfo *createMCInstrInfo() { | |
| auto *X = new MCInstrInfo(); | |
| InitWebAssemblyMCInstrInfo(X); | |
| return X; | |
| } | |
| static MCRegisterInfo *createMCRegisterInfo(const Triple & /*T*/) { | |
| auto *X = new MCRegisterInfo(); | |
| InitWebAssemblyMCRegisterInfo(X, 0); | |
| return X; | |
| } | |
| static MCInstPrinter *createMCInstPrinter(const Triple & /*T*/, | |
| unsigned SyntaxVariant, | |
| const MCAsmInfo &MAI, | |
| const MCInstrInfo &MII, | |
| const MCRegisterInfo &MRI) { | |
| assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant"); | |
| return new WebAssemblyInstPrinter(MAI, MII, MRI); | |
| } | |
| static MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII, | |
| const MCRegisterInfo & /*MRI*/, | |
| MCContext &Ctx) { | |
| return createWebAssemblyMCCodeEmitter(MCII); | |
| } | |
| static MCAsmBackend *createAsmBackend(const Target & /*T*/, | |
| const MCSubtargetInfo &STI, | |
| const MCRegisterInfo & /*MRI*/, | |
| const MCTargetOptions & /*Options*/) { | |
| return createWebAssemblyAsmBackend(STI.getTargetTriple()); | |
| } | |
| static MCSubtargetInfo *createMCSubtargetInfo(const Triple &TT, StringRef CPU, | |
| StringRef FS) { | |
| return createWebAssemblyMCSubtargetInfoImpl(TT, CPU, FS); | |
| } | |
| static MCTargetStreamer * | |
| createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) { | |
| return new WebAssemblyTargetWasmStreamer(S); | |
| } | |
| static MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S, | |
| formatted_raw_ostream &OS, | |
| MCInstPrinter * /*InstPrint*/, | |
| bool /*isVerboseAsm*/) { | |
| return new WebAssemblyTargetAsmStreamer(S, OS); | |
| } | |
| static MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) { | |
| return new WebAssemblyTargetNullStreamer(S); | |
| } | |
| // Force static initialization. | |
| extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTargetMC() { | |
| for (Target *T : | |
| {&getTheWebAssemblyTarget32(), &getTheWebAssemblyTarget64()}) { | |
| // Register the MC asm info. | |
| RegisterMCAsmInfoFn X(*T, createMCAsmInfo); | |
| // Register the MC instruction info. | |
| TargetRegistry::RegisterMCInstrInfo(*T, createMCInstrInfo); | |
| // Register the MC register info. | |
| TargetRegistry::RegisterMCRegInfo(*T, createMCRegisterInfo); | |
| // Register the MCInstPrinter. | |
| TargetRegistry::RegisterMCInstPrinter(*T, createMCInstPrinter); | |
| // Register the MC code emitter. | |
| TargetRegistry::RegisterMCCodeEmitter(*T, createCodeEmitter); | |
| // Register the ASM Backend. | |
| TargetRegistry::RegisterMCAsmBackend(*T, createAsmBackend); | |
| // Register the MC subtarget info. | |
| TargetRegistry::RegisterMCSubtargetInfo(*T, createMCSubtargetInfo); | |
| // Register the object target streamer. | |
| TargetRegistry::RegisterObjectTargetStreamer(*T, | |
| createObjectTargetStreamer); | |
| // Register the asm target streamer. | |
| TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer); | |
| // Register the null target streamer. | |
| TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer); | |
| } | |
| } | |
| wasm::ValType WebAssembly::toValType(const MVT &Ty) { | |
| switch (Ty.SimpleTy) { | |
| case MVT::i32: | |
| return wasm::ValType::I32; | |
| case MVT::i64: | |
| return wasm::ValType::I64; | |
| case MVT::f32: | |
| return wasm::ValType::F32; | |
| case MVT::f64: | |
| return wasm::ValType::F64; | |
| case MVT::v16i8: | |
| case MVT::v8i16: | |
| case MVT::v4i32: | |
| case MVT::v2i64: | |
| case MVT::v4f32: | |
| case MVT::v2f64: | |
| return wasm::ValType::V128; | |
| case MVT::exnref: | |
| return wasm::ValType::EXNREF; | |
| default: | |
| llvm_unreachable("unexpected type"); | |
| } | |
| } |