WebAssemblyMCTargetDesc.cpp revision 360784
1219820Sjeff//===-- WebAssemblyMCTargetDesc.cpp - WebAssembly Target Descriptions -----===//
2219820Sjeff//
3219820Sjeff// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4219820Sjeff// See https://llvm.org/LICENSE.txt for license information.
5219820Sjeff// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6219820Sjeff//
7219820Sjeff//===----------------------------------------------------------------------===//
8219820Sjeff///
9219820Sjeff/// \file
10219820Sjeff/// This file provides WebAssembly-specific target descriptions.
11219820Sjeff///
12219820Sjeff//===----------------------------------------------------------------------===//
13219820Sjeff
14219820Sjeff#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
15219820Sjeff#include "MCTargetDesc/WebAssemblyInstPrinter.h"
16219820Sjeff#include "MCTargetDesc/WebAssemblyMCAsmInfo.h"
17219820Sjeff#include "MCTargetDesc/WebAssemblyTargetStreamer.h"
18219820Sjeff#include "TargetInfo/WebAssemblyTargetInfo.h"
19219820Sjeff#include "llvm/MC/MCInstrInfo.h"
20219820Sjeff#include "llvm/MC/MCRegisterInfo.h"
21219820Sjeff#include "llvm/MC/MCSubtargetInfo.h"
22219820Sjeff#include "llvm/Support/ErrorHandling.h"
23219820Sjeff#include "llvm/Support/TargetRegistry.h"
24219820Sjeffusing namespace llvm;
25219820Sjeff
26219820Sjeff#define DEBUG_TYPE "wasm-mc-target-desc"
27219820Sjeff
28219820Sjeff#define GET_INSTRINFO_MC_DESC
29219820Sjeff#include "WebAssemblyGenInstrInfo.inc"
30219820Sjeff
31219820Sjeff#define GET_SUBTARGETINFO_MC_DESC
32219820Sjeff#include "WebAssemblyGenSubtargetInfo.inc"
33219820Sjeff
34219820Sjeff#define GET_REGINFO_MC_DESC
35219820Sjeff#include "WebAssemblyGenRegisterInfo.inc"
36219820Sjeff
37219820Sjeffstatic MCAsmInfo *createMCAsmInfo(const MCRegisterInfo & /*MRI*/,
38219820Sjeff                                  const Triple &TT,
39219820Sjeff                                  const MCTargetOptions &Options) {
40219820Sjeff  return new WebAssemblyMCAsmInfo(TT, Options);
41219820Sjeff}
42219820Sjeff
43219820Sjeffstatic MCInstrInfo *createMCInstrInfo() {
44219820Sjeff  auto *X = new MCInstrInfo();
45219820Sjeff  InitWebAssemblyMCInstrInfo(X);
46219820Sjeff  return X;
47219820Sjeff}
48219820Sjeff
49219820Sjeffstatic MCRegisterInfo *createMCRegisterInfo(const Triple & /*T*/) {
50219820Sjeff  auto *X = new MCRegisterInfo();
51219820Sjeff  InitWebAssemblyMCRegisterInfo(X, 0);
52219820Sjeff  return X;
53219820Sjeff}
54219820Sjeff
55219820Sjeffstatic MCInstPrinter *createMCInstPrinter(const Triple & /*T*/,
56219820Sjeff                                          unsigned SyntaxVariant,
57219820Sjeff                                          const MCAsmInfo &MAI,
58219820Sjeff                                          const MCInstrInfo &MII,
59219820Sjeff                                          const MCRegisterInfo &MRI) {
60219820Sjeff  assert(SyntaxVariant == 0 && "WebAssembly only has one syntax variant");
61219820Sjeff  return new WebAssemblyInstPrinter(MAI, MII, MRI);
62219820Sjeff}
63219820Sjeff
64219820Sjeffstatic MCCodeEmitter *createCodeEmitter(const MCInstrInfo &MCII,
65219820Sjeff                                        const MCRegisterInfo & /*MRI*/,
66219820Sjeff                                        MCContext &Ctx) {
67219820Sjeff  return createWebAssemblyMCCodeEmitter(MCII);
68219820Sjeff}
69219820Sjeff
70219820Sjeffstatic MCAsmBackend *createAsmBackend(const Target & /*T*/,
71219820Sjeff                                      const MCSubtargetInfo &STI,
72219820Sjeff                                      const MCRegisterInfo & /*MRI*/,
73219820Sjeff                                      const MCTargetOptions & /*Options*/) {
74219820Sjeff  return createWebAssemblyAsmBackend(STI.getTargetTriple());
75219820Sjeff}
76219820Sjeff
77219820Sjeffstatic MCSubtargetInfo *createMCSubtargetInfo(const Triple &TT, StringRef CPU,
78219820Sjeff                                              StringRef FS) {
79219820Sjeff  return createWebAssemblyMCSubtargetInfoImpl(TT, CPU, FS);
80219820Sjeff}
81219820Sjeff
82219820Sjeffstatic MCTargetStreamer *
83219820SjeffcreateObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
84219820Sjeff  return new WebAssemblyTargetWasmStreamer(S);
85219820Sjeff}
86219820Sjeff
87219820Sjeffstatic MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
88219820Sjeff                                                 formatted_raw_ostream &OS,
89219820Sjeff                                                 MCInstPrinter * /*InstPrint*/,
90219820Sjeff                                                 bool /*isVerboseAsm*/) {
91219820Sjeff  return new WebAssemblyTargetAsmStreamer(S, OS);
92219820Sjeff}
93219820Sjeff
94219820Sjeffstatic MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) {
95219820Sjeff  return new WebAssemblyTargetNullStreamer(S);
96219820Sjeff}
97219820Sjeff
98219820Sjeff// Force static initialization.
99219820Sjeffextern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTargetMC() {
100219820Sjeff  for (Target *T :
101219820Sjeff       {&getTheWebAssemblyTarget32(), &getTheWebAssemblyTarget64()}) {
102219820Sjeff    // Register the MC asm info.
103219820Sjeff    RegisterMCAsmInfoFn X(*T, createMCAsmInfo);
104219820Sjeff
105219820Sjeff    // Register the MC instruction info.
106219820Sjeff    TargetRegistry::RegisterMCInstrInfo(*T, createMCInstrInfo);
107219820Sjeff
108219820Sjeff    // Register the MC register info.
109219820Sjeff    TargetRegistry::RegisterMCRegInfo(*T, createMCRegisterInfo);
110219820Sjeff
111219820Sjeff    // Register the MCInstPrinter.
112219820Sjeff    TargetRegistry::RegisterMCInstPrinter(*T, createMCInstPrinter);
113219820Sjeff
114219820Sjeff    // Register the MC code emitter.
115219820Sjeff    TargetRegistry::RegisterMCCodeEmitter(*T, createCodeEmitter);
116219820Sjeff
117219820Sjeff    // Register the ASM Backend.
118219820Sjeff    TargetRegistry::RegisterMCAsmBackend(*T, createAsmBackend);
119219820Sjeff
120219820Sjeff    // Register the MC subtarget info.
121219820Sjeff    TargetRegistry::RegisterMCSubtargetInfo(*T, createMCSubtargetInfo);
122219820Sjeff
123219820Sjeff    // Register the object target streamer.
124219820Sjeff    TargetRegistry::RegisterObjectTargetStreamer(*T,
125219820Sjeff                                                 createObjectTargetStreamer);
126219820Sjeff    // Register the asm target streamer.
127219820Sjeff    TargetRegistry::RegisterAsmTargetStreamer(*T, createAsmTargetStreamer);
128219820Sjeff    // Register the null target streamer.
129219820Sjeff    TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer);
130219820Sjeff  }
131219820Sjeff}
132219820Sjeff
133219820Sjeffwasm::ValType WebAssembly::toValType(const MVT &Ty) {
134219820Sjeff  switch (Ty.SimpleTy) {
135219820Sjeff  case MVT::i32:
136219820Sjeff    return wasm::ValType::I32;
137219820Sjeff  case MVT::i64:
138219820Sjeff    return wasm::ValType::I64;
139219820Sjeff  case MVT::f32:
140219820Sjeff    return wasm::ValType::F32;
141219820Sjeff  case MVT::f64:
142219820Sjeff    return wasm::ValType::F64;
143219820Sjeff  case MVT::v16i8:
144219820Sjeff  case MVT::v8i16:
145219820Sjeff  case MVT::v4i32:
146219820Sjeff  case MVT::v2i64:
147219820Sjeff  case MVT::v4f32:
148219820Sjeff  case MVT::v2f64:
149219820Sjeff    return wasm::ValType::V128;
150219820Sjeff  case MVT::exnref:
151219820Sjeff    return wasm::ValType::EXNREF;
152219820Sjeff  default:
153219820Sjeff    llvm_unreachable("unexpected type");
154219820Sjeff  }
155219820Sjeff}
156219820Sjeff