diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -610,16 +610,13 @@ case wasm::R_WASM_MEMORY_ADDR_I64: case wasm::R_WASM_MEMORY_ADDR_TLS_SLEB: { // Provisional value is address of the global plus the offset - const MCSymbolWasm *Base = - cast(Layout.getBaseSymbol(*RelEntry.Symbol)); // For undefined symbols, use zero - if (!Base->isDefined()) + if (!RelEntry.Symbol->isDefined()) return 0; - const wasm::WasmDataReference &BaseRef = DataLocations[Base], - &SymRef = DataLocations[RelEntry.Symbol]; - const WasmDataSegment &Segment = DataSegments[BaseRef.Segment]; + const wasm::WasmDataReference &SymRef = DataLocations[RelEntry.Symbol]; + const WasmDataSegment &Segment = DataSegments[SymRef.Segment]; // Ignore overflow. LLVM allows address arithmetic to silently wrap. - return Segment.Offset + BaseRef.Offset + SymRef.Offset + RelEntry.Addend; + return Segment.Offset + SymRef.Offset + RelEntry.Addend; } default: llvm_unreachable("invalid relocation type"); diff --git a/llvm/test/MC/WebAssembly/alias-offset.s b/llvm/test/MC/WebAssembly/alias-offset.s --- a/llvm/test/MC/WebAssembly/alias-offset.s +++ b/llvm/test/MC/WebAssembly/alias-offset.s @@ -27,8 +27,8 @@ # CHECK-LABEL:
: # CHECK-EMPTY: -# CHECK-NEXT: 3: 41 88 80 80 80 00 i32.const 8 +# CHECK-NEXT: 3: 41 84 80 80 80 00 i32.const 4 # CHECK-NEXT: 00000004: R_WASM_MEMORY_ADDR_SLEB sym_a+0 -# CHECK-NEXT: 9: 36 02 8c 80 80 80 00 i32.store 12 +# CHECK-NEXT: 9: 36 02 88 80 80 80 00 i32.store 8 # CHECK-NEXT: 0000000b: R_WASM_MEMORY_ADDR_LEB sym_b+0 # CHECK-NEXT: 10: 0b end