summaryrefslogtreecommitdiffstats
path: root/lld/wasm
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2019-04-04 17:43:50 +0000
committerSam Clegg <sbc@chromium.org>2019-04-04 17:43:50 +0000
commit2a7cac932bbca5492e5a42d9dac33e0cb76d0f83 (patch)
tree64e21da525922e0a2d7fc39421ecd1d879f963d6 /lld/wasm
parent98e3954fe9d6ab74888c8757284136134330e475 (diff)
downloadbcm5719-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.cpp4
-rw-r--r--lld/wasm/InputFiles.cpp8
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;
OpenPOWER on IntegriCloud