diff options
| author | Sam Clegg <sbc@chromium.org> | 2019-04-04 17:43:50 +0000 |
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2019-04-04 17:43:50 +0000 |
| commit | 2a7cac932bbca5492e5a42d9dac33e0cb76d0f83 (patch) | |
| tree | 64e21da525922e0a2d7fc39421ecd1d879f963d6 /lld/wasm | |
| parent | 98e3954fe9d6ab74888c8757284136134330e475 (diff) | |
| download | bcm5719-llvm-2a7cac932bbca5492e5a42d9dac33e0cb76d0f83.tar.gz bcm5719-llvm-2a7cac932bbca5492e5a42d9dac33e0cb76d0f83.zip | |
[WebAssembly] Add new explicit relocation types for PIC relocations
See https://github.com/WebAssembly/tool-conventions/pull/106
Differential Revision: https://reviews.llvm.org/D59907
llvm-svn: 357710
Diffstat (limited to 'lld/wasm')
| -rw-r--r-- | lld/wasm/InputChunks.cpp | 4 | ||||
| -rw-r--r-- | lld/wasm/InputFiles.cpp | 8 |
2 files changed, 10 insertions, 2 deletions
diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp index 32157d3e8f2..cfa9eda7e2c 100644 --- a/lld/wasm/InputChunks.cpp +++ b/lld/wasm/InputChunks.cpp @@ -59,7 +59,9 @@ void InputChunk::verifyRelocTargets() const { ExistingValue = decodeULEB128(Loc, &BytesRead); break; case R_WASM_TABLE_INDEX_SLEB: + case R_WASM_TABLE_INDEX_REL_SLEB: case R_WASM_MEMORY_ADDR_SLEB: + case R_WASM_MEMORY_ADDR_REL_SLEB: ExistingValue = static_cast<uint32_t>(decodeSLEB128(Loc, &BytesRead)); break; case R_WASM_TABLE_INDEX_I32: @@ -119,7 +121,9 @@ void InputChunk::writeTo(uint8_t *Buf) const { encodeULEB128(Value, Loc, 5); break; case R_WASM_TABLE_INDEX_SLEB: + case R_WASM_TABLE_INDEX_REL_SLEB: case R_WASM_MEMORY_ADDR_SLEB: + case R_WASM_MEMORY_ADDR_REL_SLEB: encodeSLEB128(static_cast<int32_t>(Value), Loc, 5); break; case R_WASM_TABLE_INDEX_I32: diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 2e496963391..914b7313b79 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -99,13 +99,15 @@ uint32_t ObjFile::calcNewAddend(const WasmRelocation &Reloc) const { uint32_t ObjFile::calcExpectedValue(const WasmRelocation &Reloc) const { switch (Reloc.Type) { case R_WASM_TABLE_INDEX_I32: - case R_WASM_TABLE_INDEX_SLEB: { + case R_WASM_TABLE_INDEX_SLEB: + case R_WASM_TABLE_INDEX_REL_SLEB: { const WasmSymbol &Sym = WasmObj->syms()[Reloc.Index]; return TableEntries[Sym.Info.ElementIndex]; } case R_WASM_MEMORY_ADDR_SLEB: case R_WASM_MEMORY_ADDR_I32: - case R_WASM_MEMORY_ADDR_LEB: { + case R_WASM_MEMORY_ADDR_LEB: + case R_WASM_MEMORY_ADDR_REL_SLEB: { const WasmSymbol &Sym = WasmObj->syms()[Reloc.Index]; if (Sym.isUndefined()) return 0; @@ -140,10 +142,12 @@ uint32_t ObjFile::calcNewValue(const WasmRelocation &Reloc) const { switch (Reloc.Type) { case R_WASM_TABLE_INDEX_I32: case R_WASM_TABLE_INDEX_SLEB: + case R_WASM_TABLE_INDEX_REL_SLEB: return getFunctionSymbol(Reloc.Index)->getTableIndex(); case R_WASM_MEMORY_ADDR_SLEB: case R_WASM_MEMORY_ADDR_I32: case R_WASM_MEMORY_ADDR_LEB: + case R_WASM_MEMORY_ADDR_REL_SLEB: if (auto *Sym = dyn_cast<DefinedData>(getDataSymbol(Reloc.Index))) if (Sym->isLive()) return Sym->getVirtualAddress() + Reloc.Addend; |

