[lld][WebAssembly] Fix use of undefined funcs under --warn-unresolved-symbols (#78643)

When undefined functions exist in the final link we need to create
stub functions (otherwise direct calls to those functions could
not be generated).  We were creating those stub when
`--unresolved-symbols=ignore-all` was passed but overlooked the fact
that `--warn-unresolved-symbols` essentially has the same effect (i.e.
undefined function can exist in the final link).

Fixes: #53987
This commit is contained in:
Sam Clegg 2024-01-19 09:32:22 -08:00 committed by GitHub
parent b6677835fe
commit 5b0e45c8ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 17 deletions

View File

@ -18,10 +18,15 @@
# RUN: FileCheck -check-prefix=ERR1 %s
## Ignore all should not produce error and should not produce
# any imports. It should create a stub function in the place of the missing
# function symbol.
## any imports. It should create a stub function in the place of the missing
## function symbol.
# RUN: wasm-ld %t1.o -o %t2.wasm --unresolved-symbols=ignore-all
# RUN: obj2yaml %t2.wasm | FileCheck -check-prefix=IGNORE %s
## --warn-unresolved-symbols should behave the same
# RUN: wasm-ld %t1.o -o %t2.wasm --warn-unresolved-symbols
# RUN: obj2yaml %t2.wasm | FileCheck -check-prefix=IGNORE %s
# IGNORE-NOT: - Type: IMPORT
# IGNORE-NOT: - Type: ELEM
#
@ -52,10 +57,10 @@
# IGNORE-NEXT: - Index: 3
# IGNORE-NEXT: Name: get_func_addr
## --import-undefined should handle unresolved funtions symbols
# by importing them but still report errors/warning for missing data symbols.
# `--allow-undefined` should behave like `--import-undefined` +
# `--unresolve-symbols=ignore`
## --import-undefined should handle unresolved functions symbols
## by importing them but still report errors/warning for missing data symbols.
## `--allow-undefined` should behave like `--import-undefined` +
## `--unresolve-symbols=ignore`
# RUN: wasm-ld %t1.o -o %t3.wasm --import-undefined --unresolved-symbols=ignore-all
# RUN: obj2yaml %t3.wasm | FileCheck -check-prefix=IMPORT %s
# IMPORT: - Type: IMPORT

View File

@ -54,21 +54,22 @@ static void reportUndefined(Symbol *sym) {
case UnresolvedPolicy::Ignore:
LLVM_DEBUG(dbgs() << "ignoring undefined symbol: " + toString(*sym) +
"\n");
if (!config->importUndefined) {
if (auto *f = dyn_cast<UndefinedFunction>(sym)) {
if (!f->stubFunction) {
f->stubFunction = symtab->createUndefinedStub(*f->getSignature());
f->stubFunction->markLive();
// Mark the function itself as a stub which prevents it from being
// assigned a table entry.
f->isStub = true;
}
}
}
break;
case UnresolvedPolicy::ImportDynamic:
break;
}
if (auto *f = dyn_cast<UndefinedFunction>(sym)) {
if (!f->stubFunction &&
config->unresolvedSymbols != UnresolvedPolicy::ImportDynamic &&
!config->importUndefined) {
f->stubFunction = symtab->createUndefinedStub(*f->getSignature());
f->stubFunction->markLive();
// Mark the function itself as a stub which prevents it from being
// assigned a table entry.
f->isStub = true;
}
}
}
}