[lld][WebAssembly] Convert more tests to assembly. NFC (#184418)

The only expectations change here is that `__stack_pointer` is
no longer exports in the `archive-export.test` test. This is because
we don't enable the mutable-globals feature (since the assembly files
don't contains all the now-default features of the generic CPU).
This commit is contained in:
Sam Clegg 2026-03-03 17:04:20 -08:00 committed by GitHub
parent 3b4d5ffe84
commit 928505c983
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 86 additions and 95 deletions

View File

@ -1,9 +0,0 @@
target triple = "wasm32-unknown-unknown"
declare i32 @bar() local_unnamed_addr #1
define i32 @foo() local_unnamed_addr #0 {
entry:
%call = tail call i32 @bar() #2
ret i32 %call
}

View File

@ -0,0 +1,7 @@
.functype bar () -> (i32)
.globl foo
foo:
.functype foo () -> (i32)
call bar
end_function

View File

@ -1,14 +0,0 @@
target triple = "wasm32-unknown-unknown"
declare i32 @foo() local_unnamed_addr #1
define i32 @bar() local_unnamed_addr #0 {
entry:
%call = tail call i32 @foo() #2
ret i32 %call
}
define void @archive2_symbol() local_unnamed_addr #0 {
entry:
ret void
}

View File

@ -0,0 +1,12 @@
.functype foo () -> (i32)
.globl bar
bar:
.functype bar () -> (i32)
call foo
end_function
.globl archive2_symbol
archive2_symbol:
.functype archive2_symbol () -> ()
end_function

View File

@ -1,11 +0,0 @@
target triple = "wasm32-unknown-unknown"
define i32 @bar() local_unnamed_addr #0 {
entry:
ret i32 1
}
define void @archive3_symbol() local_unnamed_addr #0 {
entry:
ret void
}

View File

@ -0,0 +1,10 @@
.globl bar
bar:
.functype bar () -> (i32)
i32.const 1
end_function
.globl archive3_symbol
archive3_symbol:
.functype archive3_symbol () -> ()
end_function

View File

@ -1,22 +1,19 @@
Test that --export will also fetch lazy symbols from archives
RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/start.s -o %t.o
RUN: llc -filetype=obj %S/Inputs/archive1.ll -o %t.a1.o
RUN: llc -filetype=obj %S/Inputs/archive2.ll -o %t.a2.o
RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %S/Inputs/archive1.s -o %t.a1.o
RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %S/Inputs/archive2.s -o %t.a2.o
RUN: rm -f %t.a
RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o
RUN: wasm-ld --export-dynamic --export=archive2_symbol -o %t.wasm %t.a %t.o
RUN: obj2yaml %t.wasm | FileCheck %s
RUN: wasm-ld --export-dynamic -o %t.wasm %t.a %t.o
RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=NOEXPORT
RUN: wasm-ld --export-dynamic -o %t.noexport.wasm %t.a %t.o
RUN: obj2yaml %t.noexport.wasm | FileCheck %s -check-prefix=NOEXPORT
CHECK: Exports:
CHECK-NEXT: - Name: memory
CHECK-NEXT: Kind: MEMORY
CHECK-NEXT: Index: 0
CHECK-NEXT: - Name: __stack_pointer
CHECK-NEXT: Kind: GLOBAL
CHECK-NEXT: Index: 0
CHECK-NEXT: - Name: foo
CHECK-NEXT: Kind: FUNCTION
CHECK-NEXT: Index: 1

View File

@ -1,54 +0,0 @@
; RUN: llc -filetype=obj %s -o %t.o
; RUN: llc -filetype=obj %S/Inputs/archive1.ll -o %t.a1.o
; RUN: llc -filetype=obj %S/Inputs/archive2.ll -o %t.a2.o
; RUN: llc -filetype=obj %S/Inputs/archive3.ll -o %t.a3.o
; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/hello.s -o %t.hello.o
; RUN: rm -f %t.a
; RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o %t.a3.o %t.hello.o
; RUN: rm -f %t.imports
; RUN: not wasm-ld %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-UNDEFINED %s
; CHECK-UNDEFINED: undefined symbol: missing_func
; RUN: echo 'missing_func' > %t.imports
; RUN: wasm-ld -r %t.a %t.o -o %t.wasm
; RUN: llvm-nm -a %t.wasm | FileCheck %s
target triple = "wasm32-unknown-unknown"
declare i32 @foo() local_unnamed_addr #1
declare i32 @missing_func() local_unnamed_addr #1
define void @_start() local_unnamed_addr #0 {
entry:
%call1 = call i32 @foo() #2
%call2 = call i32 @missing_func() #2
ret void
}
; Verify that mutually dependant object files in an archive is handled
; correctly. Since we're using llvm-nm, we must link with --relocatable.
;
; TODO(ncw): Update LLD so that the symbol table is written out for
; non-relocatable output (with an option to strip it)
; CHECK: 00000016 T _start
; CHECK-NEXT: 0000000a T archive2_symbol
; CHECK-NEXT: 00000001 T bar
; CHECK-NEXT: 0000000d T foo
; CHECK-NEXT: U missing_func
; Verify that symbols from unused objects don't appear in the symbol table
; CHECK-NOT: hello
; Specifying the same archive twice is allowed.
; RUN: wasm-ld %t.a %t.a %t.o -o %t.wasm
; Verfiy errors include library name
; RUN: not wasm-ld -u archive2_symbol -u archive3_symbol %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-DUP %s
; And that this also works with --whole-archive
; RUN: not wasm-ld -u archive2_symbol -u archive3_symbol --whole-archive %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-DUP %s
; CHECK-DUP: error: duplicate symbol: bar
; CHECK-DUP: >>> defined in {{.*}}.a({{.*}}.a2.o)
; CHECK-DUP: >>> defined in {{.*}}.a({{.*}}.a3.o)

53
lld/test/wasm/archive.s Normal file
View File

@ -0,0 +1,53 @@
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -filetype=obj %s -o %t.o
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -filetype=obj %S/Inputs/archive1.s -o %t.a1.o
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -filetype=obj %S/Inputs/archive2.s -o %t.a2.o
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -filetype=obj %S/Inputs/archive3.s -o %t.a3.o
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/hello.s -o %t.hello.o
# RUN: rm -f %t.a
# RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o %t.a3.o %t.hello.o
# RUN: rm -f %t.imports
# RUN: not wasm-ld %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-UNDEFINED %s
# CHECK-UNDEFINED: undefined symbol: missing_func
# RUN: echo 'missing_func' > %t.imports
# RUN: wasm-ld -r %t.a %t.o -o %t.wasm
# RUN: llvm-nm -a %t.wasm | FileCheck %s
.functype foo () -> (i32)
.functype missing_func () -> ()
.globl _start
_start:
.functype _start () -> ()
call foo
drop
call missing_func
end_function
# Verify that mutually dependant object files in an archive is handled
# correctly. Since we're using llvm-nm, we must link with --relocatable.
#
# TODO(ncw): Update LLD so that the symbol table is written out for
# non-relocatable output (with an option to strip it)
# CHECK: 00000016 T _start
# CHECK-NEXT: 0000000a T archive2_symbol
# CHECK-NEXT: 00000001 T bar
# CHECK-NEXT: 0000000d T foo
# CHECK-NEXT: U missing_func
# Verify that symbols from unused objects don't appear in the symbol table
# CHECK-NOT: hello
# Specifying the same archive twice is allowed.
# RUN: wasm-ld %t.a %t.a %t.o -o %t.wasm
# Verfiy errors include library name
# RUN: not wasm-ld -u archive2_symbol -u archive3_symbol %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-DUP %s
# And that this also works with --whole-archive
# RUN: not wasm-ld -u archive2_symbol -u archive3_symbol --whole-archive %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-DUP %s
# CHECK-DUP: error: duplicate symbol: bar
# CHECK-DUP: >>> defined in {{.*}}.a({{.*}}.a2.o)
# CHECK-DUP: >>> defined in {{.*}}.a({{.*}}.a3.o)