Index: ELF/LTO.cpp =================================================================== --- ELF/LTO.cpp +++ ELF/LTO.cpp @@ -110,6 +110,10 @@ R.VisibleToRegularObj = Sym->IsUsedInRegularObj || (R.Prevailing && Sym->includeInDynsym()); + + R.Undefined = B->isUndefined() && + (ObjSym.getFlags() & object::BasicSymbolRef::SF_Undefined); + if (R.Prevailing) undefine(Sym); } Index: test/ELF/lto/Inputs/extern_weak.ll =================================================================== --- /dev/null +++ test/ELF/lto/Inputs/extern_weak.ll @@ -0,0 +1,6 @@ +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @bar() { + ret void +} Index: test/ELF/lto/extern_weak.ll =================================================================== --- /dev/null +++ test/ELF/lto/extern_weak.ll @@ -0,0 +1,19 @@ +; REQUIRES: x86 +; RUN: llvm-as %s -o %t1.o +; RUN: llvm-as %S/Inputs/extern_weak.ll -o %t2.o +; RUN: ld.lld -m elf_x86_64 %t1.o %t2.o -o %t -shared -save-temps +; RUN: llvm-dis %t.0.4.opt.bc -o - | FileCheck %s --check-prefix=DEF +; RUN: ld.lld -m elf_x86_64 %t1.o -o %t -shared -save-temps +; RUN: llvm-dis %t.0.4.opt.bc -o - | FileCheck %s --check-prefix=UNDEF + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +declare extern_weak void @bar() + +define i32 @foo() { + ret i32 select (i1 icmp ne (void ()* @bar, void ()* null), i32 1, i32 2) +} + +; DEF: ret i32 1 +; UNDEF: ret i32 2