llvm-project/lld/test/wasm/map-file.s
Derek Schuff ad1f5457d2 [WebAssembly] Generate R_WASM_FUNCTION_OFFSET relocs in debuginfo sections
Debug info sections need R_WASM_FUNCTION_OFFSET_I32 relocs (with FK_Data_4 fixup
kinds) to refer to functions (instead of R_WASM_TABLE_INDEX as is used in data
sections). Usually this is done in a convoluted way, with unnamed temp data
symbols which target the start of the function, in which case
WasmObjectWriter::recordRelocation converts it to use the section symbol
instead. However in some cases the function can actually be undefined; in this
case the dwarf generator uses the function symbol (a named undefined function
symbol) instead. In that case the section-symbol transform doesn't work and we
need to generate the correct reloc type a different way. In this change
WebAssemblyWasmObjectWriter::getRelocType takes the fixup section type into
account to choose the correct reloc type.

Fixes PR50408
Differential Revision: https://reviews.llvm.org/D103557
2021-07-19 14:02:33 -07:00

75 lines
2.6 KiB
ArmAsm

# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %s -o %t1.o
# RUN: wasm-ld %t1.o -o %t -M | FileCheck --match-full-lines --strict-whitespace %s
# RUN: wasm-ld %t1.o -o %t -print-map | FileCheck --match-full-lines --strict-whitespace %s
# RUN: wasm-ld %t1.o -o %t -Map=%t.map
# RUN: FileCheck --match-full-lines --strict-whitespace %s < %t.map
.globaltype wasm_global, i32, immutable
wasm_global:
bar:
.functype bar () -> (i32)
i32.const somedata
i32.const somezeroes
drop
end_function
write_global:
.functype write_global (i32) -> ()
local.get 0
global.set wasm_global
end_function
.globl _start
_start:
.functype _start () -> ()
call bar
call write_global
end_function
.section .data.somedata,"",@
somedata:
.int32 123
.int32 bar
.size somedata, 8
.section .bss.somezeroes,"",@
somezeroes:
.int32 0
.size somezeroes, 4
.section .debug_info,"",@
.int32 bar
# CHECK: Addr Off Size Out In Symbol
# CHECK-NEXT: - 8 e TYPE
# CHECK-NEXT: - 16 6 FUNCTION
# CHECK-NEXT: - 1c 7 TABLE
# CHECK-NEXT: - 23 5 MEMORY
# CHECK-NEXT: - 28 f GLOBAL
# CHECK-NEXT: 0 0 0 __stack_pointer
# CHECK-NEXT: 1 0 0 wasm_global
# CHECK-NEXT: - 37 15 EXPORT
# CHECK-NEXT: - 4c 9 ELEM
# CHECK-NEXT: - 55 2d CODE
# CHECK-NEXT: - 56 10 {{.*}}{{/|\\}}map-file.s.tmp1.o:(bar)
# CHECK-NEXT: - 56 10 bar
# CHECK-NEXT: - 66 b {{.*}}{{/|\\}}map-file.s.tmp1.o:(write_global)
# CHECK-NEXT: - 66 b write_global
# CHECK-NEXT: - 71 f {{.*}}{{/|\\}}map-file.s.tmp1.o:(_start)
# CHECK-NEXT: - 71 f _start
# CHECK-NEXT: - 82 11 DATA
# CHECK-NEXT: 400 83 8 .data
# CHECK-NEXT: 400 89 8 {{.*}}{{/|\\}}map-file.s.tmp1.o:(.data.somedata)
# CHECK-NEXT: 400 89 8 somedata
# CHECK-NEXT: 408 82 4 .bss
# CHECK-NEXT: 408 0 4 {{.*}}{{/|\\}}map-file.s.tmp1.o:(.bss.somezeroes)
# CHECK-NEXT: 408 0 4 somezeroes
# CHECK-NEXT: - 93 12 CUSTOM(.debug_info)
# CHECK-NEXT: - a5 50 CUSTOM(name)
# RUN: not wasm-ld %t1.o -o /dev/null -Map=/ 2>&1 \
# RUN: | FileCheck -check-prefix=FAIL %s
# FAIL: wasm-ld: error: cannot open map file /