forked from OSchip/llvm-project
[WebAssembly] Fix undefined weak function symbols in LTO builds
Summary: Fixes PR40219 Subscribers: dschuff, mehdi_amini, inglorion, jgravelle-google, aheejin, sunfish, steven_wu, dexonsmith, llvm-commits Differential Revision: https://reviews.llvm.org/D57420 llvm-svn: 352575
This commit is contained in:
parent
a15f5d0e4c
commit
e320cea5b9
|
@ -0,0 +1,20 @@
|
|||
; RUN: llvm-as %s -o %t.o
|
||||
; RUN: wasm-ld %t.o -o %t.wasm
|
||||
; RUN: obj2yaml %t.wasm | FileCheck %s
|
||||
|
||||
; Test that undefined weak external functions are handled in the LTO case
|
||||
; We had a bug where stub function generation was failing because functions
|
||||
; that are in bitcode (pre-LTO) don't have signatures assigned.
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
||||
target triple = "wasm32-unknown-unknown"
|
||||
|
||||
declare extern_weak i32 @foo()
|
||||
|
||||
define void @_start() #0 {
|
||||
entry:
|
||||
%call2 = call i32 @foo()
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK: Name: undefined function foo
|
|
@ -587,9 +587,6 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
|
|||
|
||||
Symbol *EntrySym = nullptr;
|
||||
if (!Config->Relocatable) {
|
||||
// Add synthetic dummies for weak undefined functions.
|
||||
handleWeakUndefines();
|
||||
|
||||
if (!Config->Shared && !Config->Entry.empty()) {
|
||||
EntrySym = handleUndefined(Config->Entry);
|
||||
if (EntrySym && EntrySym->isDefined())
|
||||
|
@ -613,6 +610,11 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
|
|||
if (errorCount())
|
||||
return;
|
||||
|
||||
// Add synthetic dummies for weak undefined functions. Must happen
|
||||
// after LTO otherwise functions may not yet have signatures.
|
||||
if (!Config->Relocatable)
|
||||
handleWeakUndefines();
|
||||
|
||||
if (EntrySym)
|
||||
EntrySym->setHidden(false);
|
||||
|
||||
|
|
Loading…
Reference in New Issue