xref: /freebsd-src/contrib/llvm-project/llvm/lib/BinaryFormat/Wasm.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===-- llvm/BinaryFormat/Wasm.cpp -------------------------------*- C++-*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/BinaryFormat/Wasm.h"
100b57cec5SDimitry Andric 
toString(wasm::WasmSymbolType Type)11*81ad6265SDimitry Andric llvm::StringRef llvm::wasm::toString(wasm::WasmSymbolType Type) {
120b57cec5SDimitry Andric   switch (Type) {
130b57cec5SDimitry Andric   case wasm::WASM_SYMBOL_TYPE_FUNCTION:
140b57cec5SDimitry Andric     return "WASM_SYMBOL_TYPE_FUNCTION";
150b57cec5SDimitry Andric   case wasm::WASM_SYMBOL_TYPE_GLOBAL:
160b57cec5SDimitry Andric     return "WASM_SYMBOL_TYPE_GLOBAL";
17e8d8bef9SDimitry Andric   case wasm::WASM_SYMBOL_TYPE_TABLE:
18e8d8bef9SDimitry Andric     return "WASM_SYMBOL_TYPE_TABLE";
190b57cec5SDimitry Andric   case wasm::WASM_SYMBOL_TYPE_DATA:
200b57cec5SDimitry Andric     return "WASM_SYMBOL_TYPE_DATA";
210b57cec5SDimitry Andric   case wasm::WASM_SYMBOL_TYPE_SECTION:
220b57cec5SDimitry Andric     return "WASM_SYMBOL_TYPE_SECTION";
23fe6060f1SDimitry Andric   case wasm::WASM_SYMBOL_TYPE_TAG:
24fe6060f1SDimitry Andric     return "WASM_SYMBOL_TYPE_TAG";
250b57cec5SDimitry Andric   }
260b57cec5SDimitry Andric   llvm_unreachable("unknown symbol type");
270b57cec5SDimitry Andric }
280b57cec5SDimitry Andric 
relocTypetoString(uint32_t Type)29*81ad6265SDimitry Andric llvm::StringRef llvm::wasm::relocTypetoString(uint32_t Type) {
300b57cec5SDimitry Andric   switch (Type) {
310b57cec5SDimitry Andric #define WASM_RELOC(NAME, VALUE)                                                \
320b57cec5SDimitry Andric   case VALUE:                                                                  \
330b57cec5SDimitry Andric     return #NAME;
340b57cec5SDimitry Andric #include "llvm/BinaryFormat/WasmRelocs.def"
350b57cec5SDimitry Andric #undef WASM_RELOC
360b57cec5SDimitry Andric   default:
370b57cec5SDimitry Andric     llvm_unreachable("unknown reloc type");
380b57cec5SDimitry Andric   }
390b57cec5SDimitry Andric }
400b57cec5SDimitry Andric 
sectionTypeToString(uint32_t Type)41*81ad6265SDimitry Andric llvm::StringRef llvm::wasm::sectionTypeToString(uint32_t Type) {
42*81ad6265SDimitry Andric #define ECase(X)                                                               \
43*81ad6265SDimitry Andric   case wasm::WASM_SEC_##X:                                                     \
44*81ad6265SDimitry Andric     return #X;
45*81ad6265SDimitry Andric   switch (Type) {
46*81ad6265SDimitry Andric     ECase(CUSTOM);
47*81ad6265SDimitry Andric     ECase(TYPE);
48*81ad6265SDimitry Andric     ECase(IMPORT);
49*81ad6265SDimitry Andric     ECase(FUNCTION);
50*81ad6265SDimitry Andric     ECase(TABLE);
51*81ad6265SDimitry Andric     ECase(MEMORY);
52*81ad6265SDimitry Andric     ECase(GLOBAL);
53*81ad6265SDimitry Andric     ECase(EXPORT);
54*81ad6265SDimitry Andric     ECase(START);
55*81ad6265SDimitry Andric     ECase(ELEM);
56*81ad6265SDimitry Andric     ECase(CODE);
57*81ad6265SDimitry Andric     ECase(DATA);
58*81ad6265SDimitry Andric     ECase(DATACOUNT);
59*81ad6265SDimitry Andric     ECase(TAG);
60*81ad6265SDimitry Andric   default:
61*81ad6265SDimitry Andric     llvm_unreachable("unknown section type");
62*81ad6265SDimitry Andric   }
63*81ad6265SDimitry Andric #undef ECase
64*81ad6265SDimitry Andric }
65*81ad6265SDimitry Andric 
relocTypeHasAddend(uint32_t Type)660b57cec5SDimitry Andric bool llvm::wasm::relocTypeHasAddend(uint32_t Type) {
670b57cec5SDimitry Andric   switch (Type) {
680b57cec5SDimitry Andric   case R_WASM_MEMORY_ADDR_LEB:
695ffd83dbSDimitry Andric   case R_WASM_MEMORY_ADDR_LEB64:
700b57cec5SDimitry Andric   case R_WASM_MEMORY_ADDR_SLEB:
715ffd83dbSDimitry Andric   case R_WASM_MEMORY_ADDR_SLEB64:
720b57cec5SDimitry Andric   case R_WASM_MEMORY_ADDR_REL_SLEB:
735ffd83dbSDimitry Andric   case R_WASM_MEMORY_ADDR_REL_SLEB64:
740b57cec5SDimitry Andric   case R_WASM_MEMORY_ADDR_I32:
755ffd83dbSDimitry Andric   case R_WASM_MEMORY_ADDR_I64:
76e8d8bef9SDimitry Andric   case R_WASM_MEMORY_ADDR_TLS_SLEB:
77fe6060f1SDimitry Andric   case R_WASM_MEMORY_ADDR_TLS_SLEB64:
780b57cec5SDimitry Andric   case R_WASM_FUNCTION_OFFSET_I32:
79e8d8bef9SDimitry Andric   case R_WASM_FUNCTION_OFFSET_I64:
800b57cec5SDimitry Andric   case R_WASM_SECTION_OFFSET_I32:
81fe6060f1SDimitry Andric   case R_WASM_MEMORY_ADDR_LOCREL_I32:
820b57cec5SDimitry Andric     return true;
830b57cec5SDimitry Andric   default:
840b57cec5SDimitry Andric     return false;
850b57cec5SDimitry Andric   }
860b57cec5SDimitry Andric }
87