diff --git a/lld/test/wasm/Inputs/strong-symbol.ll b/lld/test/wasm/Inputs/strong-symbol.ll new file mode 100644 index 000000000000..59bce524d45e --- /dev/null +++ b/lld/test/wasm/Inputs/strong-symbol.ll @@ -0,0 +1,6 @@ +target triple = "wasm32-unknown-unknown-wasm" + +define i64 @weakFn() #0 { +entry: + ret i64 1 +} diff --git a/lld/test/wasm/signature-mismatch-weak.ll b/lld/test/wasm/signature-mismatch-weak.ll new file mode 100644 index 000000000000..47a8359aa5d5 --- /dev/null +++ b/lld/test/wasm/signature-mismatch-weak.ll @@ -0,0 +1,19 @@ +; RUN: llc -filetype=obj %p/Inputs/weak-symbol1.ll -o %t.weak.o +; RUN: llc -filetype=obj %p/Inputs/strong-symbol.ll -o %t.strong.o +; RUN: llc -filetype=obj %s -o %t.o +; RUN: not wasm-ld --check-signatures -o %t.wasm %t.o %t.strong.o %t.weak.o 2>&1 | FileCheck %s +; RUN: wasm-ld -o %t.wasm %t.o %t.strong.o %t.weak.o + +target triple = "wasm32-unknown-unknown-wasm" + +declare i32 @weakFn() local_unnamed_addr + +define void @_start() local_unnamed_addr { +entry: + %call = call i32 @weakFn() + ret void +} + +; CHECK: error: function signature mismatch: weakFn +; CHECK-NEXT: >>> defined as () -> I32 in {{.*}}signature-mismatch-weak.ll.tmp.o +; CHECK-NEXT: >>> defined as () -> I64 in {{.*}}signature-mismatch-weak.ll.tmp.strong.o diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp index 0fb60bb0e9fc..c46d6caacfb7 100644 --- a/lld/wasm/SymbolTable.cpp +++ b/lld/wasm/SymbolTable.cpp @@ -175,6 +175,7 @@ Symbol *SymbolTable::addDefined(bool IsFunction, StringRef Name, uint32_t Flags, } else if ((Flags & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) { // the new symbol is weak we can ignore it DEBUG(dbgs() << "existing symbol takes precedence\n"); + CheckTypes = true; } else if (S->isWeak()) { // the existing symbol is, so we replace it DEBUG(dbgs() << "replacing existing weak symbol\n");