1 //===-- WebAssemblyMCTypeUtilities - WebAssembly Type Utilities-*- C++ -*-====// 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 contains the declaration of the WebAssembly-specific type parsing 11 /// utility functions. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTYPEUTILITIES_H 16 #define LLVM_LIB_TARGET_WEBASSEMBLY_MCTARGETDESC_WEBASSEMBLYMCTYPEUTILITIES_H 17 18 #include "llvm/BinaryFormat/Wasm.h" 19 20 namespace llvm { 21 22 namespace WebAssembly { 23 24 /// Used as immediate MachineOperands for block signatures 25 enum class BlockType : unsigned { 26 Invalid = 0x00, 27 Void = 0x40, 28 I32 = unsigned(wasm::ValType::I32), 29 I64 = unsigned(wasm::ValType::I64), 30 F32 = unsigned(wasm::ValType::F32), 31 F64 = unsigned(wasm::ValType::F64), 32 V128 = unsigned(wasm::ValType::V128), 33 Externref = unsigned(wasm::ValType::EXTERNREF), 34 Funcref = unsigned(wasm::ValType::FUNCREF), 35 Exnref = unsigned(wasm::ValType::EXNREF), 36 // Multivalue blocks are emitted in two cases: 37 // 1. When the blocks will never be exited and are at the ends of functions 38 // (see WebAssemblyCFGStackify::fixEndsAtEndOfFunction). In this case the 39 // exact multivalue signature can always be inferred from the return type 40 // of the parent function. 41 // 2. (catch_ref ...) clause in try_table instruction. Currently all tags we 42 // support (cpp_exception and c_longjmp) throws a single i32, so the 43 // multivalue signature for this case will be (i32, exnref). 44 // The real multivalue siganture will be added in MCInstLower. 45 Multivalue = 0xffff, 46 }; 47 48 inline bool isRefType(wasm::ValType Type) { 49 return Type == wasm::ValType::EXTERNREF || Type == wasm::ValType::FUNCREF || 50 Type == wasm::ValType::EXNREF; 51 } 52 53 // Convert ValType or a list/signature of ValTypes to a string. 54 55 // Convert an unsigned integer, which can be among wasm::ValType enum, to its 56 // type name string. If the input is not within wasm::ValType, returns 57 // "invalid_type". 58 const char *anyTypeToString(unsigned Type); 59 const char *typeToString(wasm::ValType Type); 60 // Convert a list of ValTypes into a string in the format of 61 // "type0, type1, ... typeN" 62 std::string typeListToString(ArrayRef<wasm::ValType> List); 63 // Convert a wasm signature into a string in the format of 64 // "(params) -> (results)", where params and results are a string of ValType 65 // lists. 66 std::string signatureToString(const wasm::WasmSignature *Sig); 67 68 // Convert a register class ID to a wasm ValType. 69 wasm::ValType regClassToValType(unsigned RC); 70 71 // Convert StringRef to ValType / HealType / BlockType 72 73 std::optional<wasm::ValType> parseType(StringRef Type); 74 BlockType parseBlockType(StringRef Type); 75 76 } // end namespace WebAssembly 77 } // end namespace llvm 78 79 #endif 80