Sam Clegg 4c75521ce0 [MC][WebAssembly] Fix crash when relocation addend underlows U32
For the object file writer we need to allow the underflow (ar write
zero), but for the final linker output we should probably generate an
error (I've left that as a TODO for now).

Fixes: https://github.com/llvm/llvm-project/issues/54012

Differential Revision: https://reviews.llvm.org/D120522
2022-02-25 07:13:15 -08:00

130 lines
3.4 KiB
ArmAsm

# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj %s -o - | llvm-readobj -r --expand-relocs - | FileCheck %s
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types -filetype=obj %s -o - | llvm-readobj -r --expand-relocs - | FileCheck --check-prefix=REF %s
# External functions
.functype c () -> (i32)
.functype d () -> (i32)
.globl f1
.globl a
.globl b
f1:
.functype f1 () -> (i32)
# Call functions at `a` and `b` indirectly.
i32.const 0
i32.load a - 10
call_indirect () -> (i64)
drop
i32.const 0
i32.load b + 20
call_indirect () -> (i32)
drop
# Call functions `c` and `d` directly
call c
drop
call d
end_function
# Pointers to functions of two different types
.section .data.a,"",@
.p2align 3
a:
.int32 5
.size a, 4
.section .data.b,"",@
.p2align 3
b:
.int32 7
.size b, 4
# CHECK: Format: WASM
# CHECK: Relocations [
# CHECK-NEXT: Section (5) CODE {
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Type: R_WASM_MEMORY_ADDR_LEB (3)
# CHECK-NEXT: Offset: 0x7
# CHECK-NEXT: Symbol: a
# CHECK-NEXT: Addend: -10
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Type: R_WASM_TYPE_INDEX_LEB (6)
# CHECK-NEXT: Offset: 0xD
# CHECK-NEXT: Index: 0x1
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Type: R_WASM_MEMORY_ADDR_LEB (3)
# CHECK-NEXT: Offset: 0x18
# CHECK-NEXT: Symbol: b
# CHECK-NEXT: Addend: 20
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Type: R_WASM_TYPE_INDEX_LEB (6)
# CHECK-NEXT: Offset: 0x1E
# CHECK-NEXT: Index: 0x0
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Type: R_WASM_FUNCTION_INDEX_LEB (0)
# CHECK-NEXT: Offset: 0x26
# CHECK-NEXT: Symbol: c
# CHECK-NEXT: }
# CHECK-NEXT: Relocation {
# CHECK-NEXT: Type: R_WASM_FUNCTION_INDEX_LEB (0)
# CHECK-NEXT: Offset: 0x2D
# CHECK-NEXT: Symbol: d
# CHECK-NEXT: }
# CHECK-NEXT: }
# CHECK-NEXT: ]
# REF: Format: WASM
# REF: Relocations [
# REF-NEXT: Section (5) CODE {
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_MEMORY_ADDR_LEB (3)
# REF-NEXT: Offset: 0x7
# REF-NEXT: Symbol: a
# REF-NEXT: Addend: -10
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_TYPE_INDEX_LEB (6)
# REF-NEXT: Offset: 0xD
# REF-NEXT: Index: 0x1
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_TABLE_NUMBER_LEB (20)
# REF-NEXT: Offset: 0x12
# REF-NEXT: Symbol: __indirect_function_table
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_MEMORY_ADDR_LEB (3)
# REF-NEXT: Offset: 0x1C
# REF-NEXT: Symbol: b
# REF-NEXT: Addend: 20
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_TYPE_INDEX_LEB (6)
# REF-NEXT: Offset: 0x22
# REF-NEXT: Index: 0x0
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_TABLE_NUMBER_LEB (20)
# REF-NEXT: Offset: 0x27
# REF-NEXT: Symbol: __indirect_function_table
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_FUNCTION_INDEX_LEB (0)
# REF-NEXT: Offset: 0x2E
# REF-NEXT: Symbol: c
# REF-NEXT: }
# REF-NEXT: Relocation {
# REF-NEXT: Type: R_WASM_FUNCTION_INDEX_LEB (0)
# REF-NEXT: Offset: 0x35
# REF-NEXT: Symbol: d
# REF-NEXT: }
# REF-NEXT: }
# REF-NEXT: ]