[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:
Sam Clegg 2019-01-30 00:25:52 +00:00
parent a15f5d0e4c
commit e320cea5b9
2 changed files with 25 additions and 3 deletions

View File

@ -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

View File

@ -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);