From 020d4fb17f92410117bc858f586fead7c5088696 Mon Sep 17 00:00:00 2001 From: Artem Belevich Date: Tue, 1 Sep 2015 17:55:55 +0000 Subject: New bitcode linker flags: -only-needed -- link in only symbols needed by destination module -internalize -- internalize linked symbols Differential Revision: http://reviews.llvm.org/D12459 llvm-svn: 246561 --- llvm/tools/llvm-link/llvm-link.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'llvm/tools/llvm-link') diff --git a/llvm/tools/llvm-link/llvm-link.cpp b/llvm/tools/llvm-link/llvm-link.cpp index 369f3477fe5..7f294f3e719 100644 --- a/llvm/tools/llvm-link/llvm-link.cpp +++ b/llvm/tools/llvm-link/llvm-link.cpp @@ -47,6 +47,12 @@ static cl::opt OutputFilename("o", cl::desc("Override output filename"), cl::init("-"), cl::value_desc("filename")); +static cl::opt +Internalize("internalize", cl::desc("Internalize linked symbols")); + +static cl::opt +OnlyNeeded("only-needed", cl::desc("Link only needed symbols")); + static cl::opt Force("f", cl::desc("Enable binary output on terminals")); @@ -114,7 +120,9 @@ static void diagnosticHandler(const DiagnosticInfo &DI) { static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, const cl::list &Files, - bool OverrideDuplicateSymbols) { + unsigned Flags) { + // Filter out flags that don't apply to the first file we load. + unsigned ApplicableFlags = Flags & Linker::Flags::OverrideFromSrc; for (const auto &File : Files) { std::unique_ptr M = loadFile(argv0, File, Context); if (!M.get()) { @@ -130,8 +138,10 @@ static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, if (Verbose) errs() << "Linking in '" << File << "'\n"; - if (L.linkInModule(M.get(), OverrideDuplicateSymbols)) + if (L.linkInModule(M.get(), ApplicableFlags)) return false; + // All linker flags apply to linking of subsequent files. + ApplicableFlags = Flags; } return true; @@ -149,12 +159,19 @@ int main(int argc, char **argv) { auto Composite = make_unique("llvm-link", Context); Linker L(Composite.get(), diagnosticHandler); + unsigned Flags = Linker::Flags::None; + if (Internalize) + Flags |= Linker::Flags::InternalizeLinkedSymbols; + if (OnlyNeeded) + Flags |= Linker::Flags::LinkOnlyNeeded; + // First add all the regular input files - if (!linkFiles(argv[0], Context, L, InputFilenames, false)) + if (!linkFiles(argv[0], Context, L, InputFilenames, Flags)) return 1; // Next the -override ones. - if (!linkFiles(argv[0], Context, L, OverridingInputs, true)) + if (!linkFiles(argv[0], Context, L, OverridingInputs, + Flags | Linker::Flags::OverrideFromSrc)) return 1; if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite; -- cgit v1.2.3