# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s # RUN: wasm-ld -r -o %t.wasm %t.o # RUN: obj2yaml %t.wasm | FileCheck %s # RUN: llvm-objdump --disassemble-symbols=_start --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DIS .hidden foo .hidden bar .globl foo .globl bar # Similar to what would be generated from: `int foo[76]` .section .bss.foo,"",@ .p2align 4 foo: .skip 304 .size foo, 304 # bar contains a pointer to the 16th element of foo, which happens to be 64 # bytes in. This generates an addend of 64 which is the value at which signed # and unsigned LEB encodes will differ. .section .data.bar,"",@ .p2align 2 bar: .int32 foo+64 .size bar, 4 # Check that negative addends also work here .section .data.negative_addend,"",@ .p2align 2 negative_addend: .int32 foo-16 .size negative_addend, 4 .globl _start .section .text,"",@ _start: .functype _start () -> () i32.const 0 i32.load foo + 10 drop i32.const 0 i32.load foo - 10 drop i32.const 0 # This will underflow because i32.load (and the # corresponding relocation type) take an unsgiend (U32) # immediate. i32.load foo - 2048 drop end_function # CHECK: - Type: CODE # CHECK-NEXT: Relocations: # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB # CHECK-NEXT: Index: 0 # CHECK-NEXT: Offset: 0x7 # CHECK-NEXT: Addend: 10 # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB # CHECK-NEXT: Index: 0 # CHECK-NEXT: Offset: 0x11 # CHECK-NEXT: Addend: -10 # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_LEB # CHECK-NEXT: Index: 0 # CHECK-NEXT: Offset: 0x1B # CHECK-NEXT: Addend: -2048 # CHECK: - Type: DATA # CHECK-NEXT: Relocations: # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_I32 # CHECK-NEXT: Index: 0 # CHECK-NEXT: Offset: 0x6 # CHECK-NEXT: Addend: 64 # CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_I32 # CHECK-NEXT: Index: 0 # CHECK-NEXT: Offset: 0xF # CHECK-NEXT: Addend: -16 # DIS: <_start>: # DIS-EMPTY: # DIS-NEXT: i32.const 0 # DIS-NEXT: i32.load 26 # DIS-NEXT: drop # DIS-NEXT: i32.const 0 # DIS-NEXT: i32.load 6 # DIS-NEXT: drop # DIS-NEXT: i32.const 0 # TODO(sbc): We should probably error here rather than allowing u32 to wrap # DIS-NEXT: i32.load 4294965264 # DIS-NEXT: drop # DIS-NEXT: end