From: Sam Clegg Date: Wed, 26 Apr 2017 00:02:31 +0000 (+0000) Subject: [WebAssembly] Allow for signed relocation addends X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d420e40a969292d5db16706e54c3e41baa4e6795;p=llvm [WebAssembly] Allow for signed relocation addends Summary: Addends are used as offsets to addresses of globals and can be both positive and negative. This change prints libObject in line with the spec and the MC layer. Subscribers: jfb, dschuff Differential Revision: https://reviews.llvm.org/D32507 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301369 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ObjectYAML/WasmYAML.h b/include/llvm/ObjectYAML/WasmYAML.h index b1af8bbdfa6..dfeeb8589f8 100644 --- a/include/llvm/ObjectYAML/WasmYAML.h +++ b/include/llvm/ObjectYAML/WasmYAML.h @@ -88,7 +88,7 @@ struct Relocation { RelocType Type; uint32_t Index; yaml::Hex32 Offset; - yaml::Hex32 Addend; + int32_t Addend; }; struct DataSegment { diff --git a/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index e1b3c4e1f39..4e1f237e17c 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/lib/Object/WasmObjectFile.cpp @@ -316,14 +316,15 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, const uint8_t *Ptr, case wasm::R_WEBASSEMBLY_FUNCTION_INDEX_LEB: case wasm::R_WEBASSEMBLY_TABLE_INDEX_SLEB: case wasm::R_WEBASSEMBLY_TABLE_INDEX_I32: + case wasm::R_WEBASSEMBLY_TYPE_INDEX_LEB: break; case wasm::R_WEBASSEMBLY_GLOBAL_ADDR_LEB: case wasm::R_WEBASSEMBLY_GLOBAL_ADDR_SLEB: case wasm::R_WEBASSEMBLY_GLOBAL_ADDR_I32: - Reloc.Addend = readVaruint32(Ptr); + Reloc.Addend = readVarint32(Ptr); break; default: - return make_error("Bad relocation type", + return make_error("Bad relocation type: " + Twine(Reloc.Type), object_error::parse_failed); } Section->Relocations.push_back(Reloc); diff --git a/lib/ObjectYAML/WasmYAML.cpp b/lib/ObjectYAML/WasmYAML.cpp index 1c7c07ae29e..9b1ff7e5dc1 100644 --- a/lib/ObjectYAML/WasmYAML.cpp +++ b/lib/ObjectYAML/WasmYAML.cpp @@ -223,7 +223,7 @@ void MappingTraits::mapping( IO.mapRequired("Type", Relocation.Type); IO.mapRequired("Index", Relocation.Index); IO.mapRequired("Offset", Relocation.Offset); - IO.mapRequired("Addend", Relocation.Addend); + IO.mapOptional("Addend", Relocation.Addend, 0); } void MappingTraits::mapping( diff --git a/test/ObjectYAML/wasm/code_section.yaml b/test/ObjectYAML/wasm/code_section.yaml index b75bf7e1cfd..5359d2a100c 100644 --- a/test/ObjectYAML/wasm/code_section.yaml +++ b/test/ObjectYAML/wasm/code_section.yaml @@ -21,11 +21,9 @@ Sections: - Type: R_WEBASSEMBLY_TABLE_INDEX_SLEB Index: 0 Offset: 0x00000006 - Addend: 0x00000000 - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB Index: 1 Offset: 0x00000025 - Addend: 0x00000000 Functions: - Locals: - Type: I32 @@ -56,11 +54,9 @@ Sections: # CHECK: - Type: R_WEBASSEMBLY_TABLE_INDEX_SLEB # CHECK: Index: 0 # CHECK: Offset: 0x00000006 -# CHECK: Addend: 0x00000000 # CHECK: - Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB # CHECK: Index: 1 # CHECK: Offset: 0x00000025 -# CHECK: Addend: 0x00000000 # CHECK: Functions: # CHECK: - Locals: # CHECK: - Type: I32 diff --git a/test/ObjectYAML/wasm/data_section.yaml b/test/ObjectYAML/wasm/data_section.yaml index 542d0efe42f..b8c65abbff9 100644 --- a/test/ObjectYAML/wasm/data_section.yaml +++ b/test/ObjectYAML/wasm/data_section.yaml @@ -13,16 +13,34 @@ Sections: Opcode: I32_CONST Value: 4 Content: '10001000' + Relocations: + - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32 + Index: 0 + Offset: 0x00000006 + Addend: 8 + - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32 + Index: 0 + Offset: 0x00000006 + Addend: -6 ... # CHECK: --- !WASM # CHECK: FileHeader: # CHECK: Version: 0x00000001 # CHECK: Sections: # CHECK: - Type: DATA -# CHECK: Segments: -# CHECK: - Index: 0 -# CHECK: Offset: -# CHECK: Opcode: I32_CONST -# CHECK: Value: 4 -# CHECK: Content: '10001000' -# CHECK: ... +# CHECK-NEXT: Relocations: +# CHECK-NEXT: - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32 +# CHECK-NEXT: Index: 0 +# CHECK-NEXT: Offset: 0x00000006 +# CHECK-NEXT: Addend: 8 +# CHECK-NEXT: - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32 +# CHECK-NEXT: Index: 0 +# CHECK-NEXT: Offset: 0x00000006 +# CHECK-NEXT: Addend: -6 +# CHECK-NEXT: Segments: +# CHECK-NEXT: - Index: 0 +# CHECK-NEXT: Offset: +# CHECK-NEXT: Opcode: I32_CONST +# CHECK-NEXT: Value: 4 +# CHECK-NEXT: Content: '10001000' +# CHECK-NEXT: ...