When a symbol is exported via --export=foo but --allow-undefined is also specified, the symbol is now allowed to be undefined. Previously we were special casing such symbols. This combinations of behavior is exactly what emescripten requires. Although we are trying hard not to allow emscripten specific features in lld, this one makes sense. Enforce this behavior by added this case to test/wasm/undefined.ll. Differential Revision: https://reviews.llvm.org/D44237 llvm-svn: 326976
27 lines
952 B
LLVM
27 lines
952 B
LLVM
; RUN: llc -filetype=obj %s -o %t.o
|
|
; RUN: wasm-ld --check-signatures --allow-undefined -o %t.wasm %t.o
|
|
|
|
; Fails due to undefined 'foo' and also 'baz'
|
|
; RUN: not wasm-ld --check-signatures --undefined=baz -o %t.wasm %t.o 2>&1 | FileCheck %s
|
|
; CHECK: error: {{.*}}.o: undefined symbol: foo
|
|
; CHECK: error: undefined symbol: baz
|
|
|
|
; Succeeds if we pass a file containing 'foo' as --allow-undefined-file.
|
|
; RUN: echo 'foo' > %t.txt
|
|
; RUN: wasm-ld --check-signatures --allow-undefined-file=%t.txt -o %t.wasm %t.o
|
|
|
|
; Succeeds even if a missing symbol is added via --export
|
|
; RUN: wasm-ld --check-signatures --allow-undefined --export=xxx -o %t.wasm %t.o
|
|
|
|
target triple = "wasm32-unknown-unknown-wasm"
|
|
|
|
; Takes the address of the external foo() resulting in undefined external
|
|
@bar = hidden local_unnamed_addr global i8* bitcast (i32 ()* @foo to i8*), align 4
|
|
|
|
declare i32 @foo() #0
|
|
|
|
define hidden void @_start() local_unnamed_addr #0 {
|
|
entry:
|
|
ret void
|
|
}
|