forked from OSchip/llvm-project
[llvm-link] fix linker behavior when linking archives with --only-needed option
This patch fixes linker behavior when archive is linked with other inputs as a library (i.e. when --only-needed option is specified). In this case library is expected to be normally linked first into a separate module and only after that linker should import required symbols from the linked library module. Reviewed By: tra Differential Revision: https://reviews.llvm.org/D92535
This commit is contained in:
parent
a427f15d60
commit
761aca1e2e
|
@ -0,0 +1,8 @@
|
||||||
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
|
||||||
|
define void @i() {
|
||||||
|
call void @f()
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @f()
|
|
@ -0,0 +1,15 @@
|
||||||
|
; RUN: llvm-as %S/Inputs/f.ll -o %t.f.bc
|
||||||
|
; RUN: llvm-as %S/Inputs/g.ll -o %t.g.bc
|
||||||
|
; RUN: llvm-as %S/Inputs/i.ll -o %t.i.bc
|
||||||
|
; RUN: rm -f %t.lib
|
||||||
|
; RUN: llvm-ar cr %t.lib %t.f.bc %t.g.bc %t.i.bc
|
||||||
|
; RUN: llvm-link %s %t.lib -o %t.linked.bc --only-needed
|
||||||
|
; RUN: llvm-nm %t.linked.bc | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: -------- T f
|
||||||
|
; CHECK: -------- T i
|
||||||
|
|
||||||
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
|
||||||
|
@i = external global i8*
|
||||||
|
@llvm.used = appending global [1 x i8*] [i8* bitcast (i8** @i to i8*)], section "llvm.metadata"
|
|
@ -142,9 +142,9 @@ static std::unique_ptr<Module> loadFile(const char *argv0,
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::unique_ptr<Module>
|
static std::unique_ptr<Module> loadArFile(const char *Argv0,
|
||||||
loadArFile(const char *Argv0, std::unique_ptr<MemoryBuffer> Buffer,
|
std::unique_ptr<MemoryBuffer> Buffer,
|
||||||
LLVMContext &Context, unsigned OrigFlags, unsigned ApplicableFlags) {
|
LLVMContext &Context) {
|
||||||
std::unique_ptr<Module> Result(new Module("ArchiveModule", Context));
|
std::unique_ptr<Module> Result(new Module("ArchiveModule", Context));
|
||||||
StringRef ArchiveName = Buffer->getBufferIdentifier();
|
StringRef ArchiveName = Buffer->getBufferIdentifier();
|
||||||
if (Verbose)
|
if (Verbose)
|
||||||
|
@ -197,9 +197,8 @@ loadArFile(const char *Argv0, std::unique_ptr<MemoryBuffer> Buffer,
|
||||||
}
|
}
|
||||||
if (Verbose)
|
if (Verbose)
|
||||||
errs() << "Linking member '" << ChildName << "' of archive library.\n";
|
errs() << "Linking member '" << ChildName << "' of archive library.\n";
|
||||||
if (Linker::linkModules(*Result, std::move(M), ApplicableFlags))
|
if (Linker::linkModules(*Result, std::move(M)))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
ApplicableFlags = OrigFlags;
|
|
||||||
} // end for each child
|
} // end for each child
|
||||||
ExitOnErr(std::move(Err));
|
ExitOnErr(std::move(Err));
|
||||||
return Result;
|
return Result;
|
||||||
|
@ -354,8 +353,7 @@ static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L,
|
||||||
|
|
||||||
std::unique_ptr<Module> M =
|
std::unique_ptr<Module> M =
|
||||||
identify_magic(Buffer->getBuffer()) == file_magic::archive
|
identify_magic(Buffer->getBuffer()) == file_magic::archive
|
||||||
? loadArFile(argv0, std::move(Buffer), Context, Flags,
|
? loadArFile(argv0, std::move(Buffer), Context)
|
||||||
ApplicableFlags)
|
|
||||||
: loadFile(argv0, std::move(Buffer), Context);
|
: loadFile(argv0, std::move(Buffer), Context);
|
||||||
if (!M.get()) {
|
if (!M.get()) {
|
||||||
errs() << argv0 << ": ";
|
errs() << argv0 << ": ";
|
||||||
|
|
Loading…
Reference in New Issue