Path: blob/main/contrib/llvm-project/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyMCTargetDesc.cpp
35293 views
//===-- WebAssemblyMCTargetDesc.cpp - WebAssembly Target Descriptions -----===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file9/// This file provides WebAssembly-specific target descriptions.10///11//===----------------------------------------------------------------------===//1213#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"23using namespace llvm;2425#define DEBUG_TYPE "wasm-mc-target-desc"2627#define GET_INSTRINFO_MC_DESC28#define ENABLE_INSTR_PREDICATE_VERIFIER29#include "WebAssemblyGenInstrInfo.inc"3031#define GET_SUBTARGETINFO_MC_DESC32#include "WebAssemblyGenSubtargetInfo.inc"3334#define GET_REGINFO_MC_DESC35#include "WebAssemblyGenRegisterInfo.inc"3637// Exception handling & setjmp-longjmp handling related options.3839// Emscripten's asm.js-style exception handling40cl::opt<bool> WebAssembly::WasmEnableEmEH(41"enable-emscripten-cxx-exceptions",42cl::desc("WebAssembly Emscripten-style exception handling"),43cl::init(false));44// Emscripten's asm.js-style setjmp/longjmp handling45cl::opt<bool> WebAssembly::WasmEnableEmSjLj(46"enable-emscripten-sjlj",47cl::desc("WebAssembly Emscripten-style setjmp/longjmp handling"),48cl::init(false));49// Exception handling using wasm EH instructions50cl::opt<bool>51WebAssembly::WasmEnableEH("wasm-enable-eh",52cl::desc("WebAssembly exception handling"));53// setjmp/longjmp handling using wasm EH instrutions54cl::opt<bool> WebAssembly::WasmEnableSjLj(55"wasm-enable-sjlj", cl::desc("WebAssembly setjmp/longjmp handling"));56// Whether we use the new exnref Wasm EH proposal adopted on Oct 2023.57// Should be used with -wasm-enable-eh.58// Currently set to false by default, but will later change to true and then59// later can be removed after the legacy WAsm EH instructions are removed.60cl::opt<bool> WebAssembly::WasmEnableExnref(61"wasm-enable-exnref", cl::desc("WebAssembly exception handling (exnref)"),62cl::init(false));6364static MCAsmInfo *createMCAsmInfo(const MCRegisterInfo & /*MRI*/,65const Triple &TT,66const MCTargetOptions &Options) {67return new WebAssemblyMCAsmInfo(TT, Options);68}6970static MCInstrInfo *createMCInstrInfo() {71auto *X = new MCInstrInfo();72InitWebAssemblyMCInstrInfo(X);73return X;74}7576static MCRegisterInfo *createMCRegisterInfo(const Triple & /*T*/) {77auto *X = new MCRegisterInfo();78InitWebAssemblyMCRegisterInfo(X, 0);79return X;80}8182static MCInstPrinter *createMCInstPrinter(const Triple & /*T*/,83unsigned SyntaxVariant,84const MCAsmInfo &MAI,85const MCInstrInfo &MII,86const MCRegisterInfo &MRI) {87assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant");88return new WebAssemblyInstPrinter(MAI, MII, MRI);89}9091static MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII,92MCContext &Ctx) {93return createWebAssemblyMCCodeEmitter(MCII, Ctx);94}9596static MCAsmBackend *createAsmBackend(const Target & /*T*/,97const MCSubtargetInfo &STI,98const MCRegisterInfo & /*MRI*/,99const MCTargetOptions & /*Options*/) {100return createWebAssemblyAsmBackend(STI.getTargetTriple());101}102103static MCSubtargetInfo *createMCSubtargetInfo(const Triple &TT, StringRef CPU,104StringRef FS) {105return createWebAssemblyMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);106}107108static MCTargetStreamer *109createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {110return new WebAssemblyTargetWasmStreamer(S);111}112113static MCTargetStreamer *114createAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS,115MCInstPrinter * /*InstPrint*/) {116return new WebAssemblyTargetAsmStreamer(S, OS);117}118119static MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) {120return new WebAssemblyTargetNullStreamer(S);121}122123// Force static initialization.124extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTargetMC() {125for (Target *T :126{&getTheWebAssemblyTarget32(), &getTheWebAssemblyTarget64()}) {127// Register the MC asm info.128RegisterMCAsmInfoFn X(*T, createMCAsmInfo);129130// Register the MC instruction info.131TargetRegistry::RegisterMCInstrInfo(*T, createMCInstrInfo);132133// Register the MC register info.134TargetRegistry::RegisterMCRegInfo(*T, createMCRegisterInfo);135136// Register the MCInstPrinter.137TargetRegistry::RegisterMCInstPrinter(*T, createMCInstPrinter);138139// Register the MC code emitter.140TargetRegistry::RegisterMCCodeEmitter(*T, createCodeEmitter);141142// Register the ASM Backend.143TargetRegistry::RegisterMCAsmBackend(*T, createAsmBackend);144145// Register the MC subtarget info.146TargetRegistry::RegisterMCSubtargetInfo(*T, createMCSubtargetInfo);147148// Register the object target streamer.149TargetRegistry::RegisterObjectTargetStreamer(*T,150createObjectTargetStreamer);151// Register the asm target streamer.152TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer);153// Register the null target streamer.154TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer);155}156}157158159