# 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: ]