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 (and other non-void blocks) are only emitted when the 37 // blocks will never be exited and are at the ends of functions (see 38 // WebAssemblyCFGStackify::fixEndsAtEndOfFunction). They also are never made 39 // to pop values off the stack, so the exact multivalue signature can always 40 // be inferred from the return type of the parent function in MCInstLower. 41 Multivalue = 0xffff, 42 }; 43 44 inline bool isRefType(wasm::ValType Type) { 45 return Type == wasm::ValType::EXTERNREF || Type == wasm::ValType::FUNCREF || 46 Type == wasm::ValType::EXNREF; 47 } 48 49 // Convert ValType or a list/signature of ValTypes to a string. 50 51 // Convert an unsigned integer, which can be among wasm::ValType enum, to its 52 // type name string. If the input is not within wasm::ValType, returns 53 // "invalid_type". 54 const char *anyTypeToString(unsigned Type); 55 const char *typeToString(wasm::ValType Type); 56 // Convert a list of ValTypes into a string in the format of 57 // "type0, type1, ... typeN" 58 std::string typeListToString(ArrayRef<wasm::ValType> List); 59 // Convert a wasm signature into a string in the format of 60 // "(params) -> (results)", where params and results are a string of ValType 61 // lists. 62 std::string signatureToString(const wasm::WasmSignature *Sig); 63 64 // Convert a register class ID to a wasm ValType. 65 wasm::ValType regClassToValType(unsigned RC); 66 67 // Convert StringRef to ValType / HealType / BlockType 68 69 std::optional<wasm::ValType> parseType(StringRef Type); 70 BlockType parseBlockType(StringRef Type); 71 72 } // end namespace WebAssembly 73 } // end namespace llvm 74 75 #endif 76