diff options
author | Sam Clegg <sbc@chromium.org> | 2022-03-09 18:11:44 -0800 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2022-03-14 08:55:47 -0700 |
commit | 9504ab32b76646116585cae4298f700cf46721ab (patch) | |
tree | f61eb0df890fe36ce4458f6599ac12e24d0713f5 /llvm/lib/MC/WasmObjectWriter.cpp | |
parent | 8361c5da30588d3d4a48eae648f53be1feb5cfad (diff) | |
download | llvm-9504ab32b76646116585cae4298f700cf46721ab.zip llvm-9504ab32b76646116585cae4298f700cf46721ab.tar.gz llvm-9504ab32b76646116585cae4298f700cf46721ab.tar.bz2 |
[WebAssembly] Second phase of implemented extended const proposal
This change continues to lay the ground work for supporting extended
const expressions in the linker.
The included test covers object file reading and writing and the YAML
representation.
Differential Revision: https://reviews.llvm.org/D121349
Diffstat (limited to 'llvm/lib/MC/WasmObjectWriter.cpp')
-rw-r--r-- | llvm/lib/MC/WasmObjectWriter.cpp | 53 |
1 files changed, 29 insertions, 24 deletions
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index 27023f1..f891f94 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -931,25 +931,29 @@ void WasmObjectWriter::writeGlobalSection(ArrayRef<wasm::WasmGlobal> Globals) { for (const wasm::WasmGlobal &Global : Globals) { encodeULEB128(Global.Type.Type, W->OS); W->OS << char(Global.Type.Mutable); - W->OS << char(Global.InitExpr.Opcode); - switch (Global.Type.Type) { - case wasm::WASM_TYPE_I32: - encodeSLEB128(0, W->OS); - break; - case wasm::WASM_TYPE_I64: - encodeSLEB128(0, W->OS); - break; - case wasm::WASM_TYPE_F32: - writeI32(0); - break; - case wasm::WASM_TYPE_F64: - writeI64(0); - break; - case wasm::WASM_TYPE_EXTERNREF: - writeValueType(wasm::ValType::EXTERNREF); - break; - default: - llvm_unreachable("unexpected type"); + if (Global.InitExpr.Extended) { + llvm_unreachable("extected init expressions not supported"); + } else { + W->OS << char(Global.InitExpr.Inst.Opcode); + switch (Global.Type.Type) { + case wasm::WASM_TYPE_I32: + encodeSLEB128(0, W->OS); + break; + case wasm::WASM_TYPE_I64: + encodeSLEB128(0, W->OS); + break; + case wasm::WASM_TYPE_F32: + writeI32(0); + break; + case wasm::WASM_TYPE_F64: + writeI64(0); + break; + case wasm::WASM_TYPE_EXTERNREF: + writeValueType(wasm::ValType::EXTERNREF); + break; + default: + llvm_unreachable("unexpected type"); + } } W->OS << char(wasm::WASM_OPCODE_END); } @@ -1658,21 +1662,22 @@ uint64_t WasmObjectWriter::writeOneObject(MCAssembler &Asm, wasm::WasmGlobal Global; Global.Type = WS.getGlobalType(); Global.Index = NumGlobalImports + Globals.size(); + Global.InitExpr.Extended = false; switch (Global.Type.Type) { case wasm::WASM_TYPE_I32: - Global.InitExpr.Opcode = wasm::WASM_OPCODE_I32_CONST; + Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_I32_CONST; break; case wasm::WASM_TYPE_I64: - Global.InitExpr.Opcode = wasm::WASM_OPCODE_I64_CONST; + Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_I64_CONST; break; case wasm::WASM_TYPE_F32: - Global.InitExpr.Opcode = wasm::WASM_OPCODE_F32_CONST; + Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_F32_CONST; break; case wasm::WASM_TYPE_F64: - Global.InitExpr.Opcode = wasm::WASM_OPCODE_F64_CONST; + Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_F64_CONST; break; case wasm::WASM_TYPE_EXTERNREF: - Global.InitExpr.Opcode = wasm::WASM_OPCODE_REF_NULL; + Global.InitExpr.Inst.Opcode = wasm::WASM_OPCODE_REF_NULL; break; default: llvm_unreachable("unexpected type"); |