1 //===-- WebAssemblyTypeUtilities.cpp - WebAssembly Type Utility Functions -===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file implements several utility functions for WebAssembly type parsing. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #include "WebAssemblyTypeUtilities.h" 15 #include "llvm/ADT/StringSwitch.h" 16 17 // Get register classes enum. 18 #define GET_REGINFO_ENUM 19 #include "WebAssemblyGenRegisterInfo.inc" 20 21 using namespace llvm; 22 23 MVT WebAssembly::parseMVT(StringRef Type) { 24 return StringSwitch<MVT>(Type) 25 .Case("i32", MVT::i32) 26 .Case("i64", MVT::i64) 27 .Case("f32", MVT::f32) 28 .Case("f64", MVT::f64) 29 .Case("i64", MVT::i64) 30 .Case("v16i8", MVT::v16i8) 31 .Case("v8i16", MVT::v8i16) 32 .Case("v4i32", MVT::v4i32) 33 .Case("v2i64", MVT::v2i64) 34 .Case("funcref", MVT::funcref) 35 .Case("externref", MVT::externref) 36 .Case("exnref", MVT::exnref) 37 .Default(MVT::INVALID_SIMPLE_VALUE_TYPE); 38 } 39 40 wasm::ValType WebAssembly::toValType(MVT Type) { 41 switch (Type.SimpleTy) { 42 case MVT::i32: 43 return wasm::ValType::I32; 44 case MVT::i64: 45 return wasm::ValType::I64; 46 case MVT::f32: 47 return wasm::ValType::F32; 48 case MVT::f64: 49 return wasm::ValType::F64; 50 case MVT::v16i8: 51 case MVT::v8i16: 52 case MVT::v4i32: 53 case MVT::v2i64: 54 case MVT::v8f16: 55 case MVT::v4f32: 56 case MVT::v2f64: 57 return wasm::ValType::V128; 58 case MVT::funcref: 59 return wasm::ValType::FUNCREF; 60 case MVT::externref: 61 return wasm::ValType::EXTERNREF; 62 case MVT::exnref: 63 return wasm::ValType::EXNREF; 64 default: 65 llvm_unreachable("unexpected type"); 66 } 67 } 68 69 void WebAssembly::wasmSymbolSetType(MCSymbolWasm *Sym, const Type *GlobalVT, 70 ArrayRef<MVT> VTs) { 71 assert(!Sym->getType()); 72 73 // Tables are represented as Arrays in LLVM IR therefore 74 // they reach this point as aggregate Array types with an element type 75 // that is a reference type. 76 wasm::ValType ValTy; 77 bool IsTable = false; 78 if (WebAssembly::isWebAssemblyTableType(GlobalVT)) { 79 IsTable = true; 80 const Type *ElTy = GlobalVT->getArrayElementType(); 81 if (WebAssembly::isWebAssemblyExternrefType(ElTy)) 82 ValTy = wasm::ValType::EXTERNREF; 83 else if (WebAssembly::isWebAssemblyFuncrefType(ElTy)) 84 ValTy = wasm::ValType::FUNCREF; 85 else 86 report_fatal_error("unhandled reference type"); 87 } else if (VTs.size() == 1) { 88 ValTy = WebAssembly::toValType(VTs[0]); 89 } else 90 report_fatal_error("Aggregate globals not yet implemented"); 91 92 if (IsTable) { 93 Sym->setType(wasm::WASM_SYMBOL_TYPE_TABLE); 94 Sym->setTableType(ValTy); 95 } else { 96 Sym->setType(wasm::WASM_SYMBOL_TYPE_GLOBAL); 97 Sym->setGlobalType(wasm::WasmGlobalType{uint8_t(ValTy), /*Mutable=*/true}); 98 } 99 } 100