From a2125b12ec22e073f5b300b395a4bcc47d79153d Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Wed, 11 Jul 2018 17:45:28 +0000 Subject: [PATCH] Also search BitcodeFiles for exclude-lib symbols Archives created with ThinLTO are bitcodes, they also need to be searched for excluded symbols. Differential Revision: https://reviews.llvm.org/D48857 llvm-svn: 336826 --- lld/ELF/Driver.cpp | 9 ++++++++- lld/test/ELF/Inputs/exclude-libs.ll | 3 +++ lld/test/ELF/exclude-libs.s | 10 +++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 lld/test/ELF/Inputs/exclude-libs.ll diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 3ef5b45..85ebb33 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1162,12 +1162,19 @@ static void excludeLibs(opt::InputArgList &Args) { DenseSet Libs = getExcludeLibs(Args); bool All = Libs.count("ALL"); - for (InputFile *File : ObjectFiles) + auto Visit = [&](InputFile *File) { if (!File->ArchiveName.empty()) if (All || Libs.count(path::filename(File->ArchiveName))) for (Symbol *Sym : File->getSymbols()) if (!Sym->isLocal() && Sym->File == File) Sym->VersionId = VER_NDX_LOCAL; + }; + + for (InputFile *File : ObjectFiles) + Visit(File); + + for (BitcodeFile *File : BitcodeFiles) + Visit(File); } // Force Sym to be entered in the output. Used for -u or equivalent. diff --git a/lld/test/ELF/Inputs/exclude-libs.ll b/lld/test/ELF/Inputs/exclude-libs.ll new file mode 100644 index 0000000..8bd9470 --- /dev/null +++ b/lld/test/ELF/Inputs/exclude-libs.ll @@ -0,0 +1,3 @@ +@fn2 = global void()* null; + +target triple = "x86_64-unknown-linux" diff --git a/lld/test/ELF/exclude-libs.s b/lld/test/ELF/exclude-libs.s index 68217e4..c061c48 100644 --- a/lld/test/ELF/exclude-libs.s +++ b/lld/test/ELF/exclude-libs.s @@ -3,9 +3,10 @@ // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \ // RUN: %p/Inputs/exclude-libs.s -o %t2.o +// RUN: llvm-as --data-layout=elf %p/Inputs/exclude-libs.ll -o %t3.o // RUN: mkdir -p %t.dir // RUN: rm -f %t.dir/exc.a -// RUN: llvm-ar rcs %t.dir/exc.a %t2.o +// RUN: llvm-ar rcs %t.dir/exc.a %t2.o %t3.o // RUN: ld.lld -shared %t.o %t.dir/exc.a -o %t.exe // RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck --check-prefix=DEFAULT %s @@ -22,7 +23,7 @@ // RUN: ld.lld -shared %t.o %t.dir/exc.a -o %t.exe --exclude-libs=ALL // RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck --check-prefix=EXCLUDE %s -// RUN: ld.lld -shared %t.o %t2.o %t.dir/exc.a -o %t.exe --exclude-libs=ALL +// RUN: ld.lld -shared %t.o %t2.o %t3.o %t.dir/exc.a -o %t.exe --exclude-libs=ALL // RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck --check-prefix=DEFAULT %s // RUN: ld.lld -shared --whole-archive %t.o %t.dir/exc.a -o %t.exe --exclude-libs foo,bar,exc.a @@ -32,10 +33,13 @@ // RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck --check-prefix=EXCLUDE %s // DEFAULT: Name: fn +// DEFAULT: Name: fn2 // DEFAULT: Name: foo // EXCLUDE-NOT: Name: fn +// EXCLUDE-NOT: Name: fn2 // EXCLUDE: Name: foo -.globl fn, foo +.globl fn, fn2, foo foo: call fn@PLT + call fn2@PLT -- 2.7.4