Index: ELF/LTO.h =================================================================== --- ELF/LTO.h +++ ELF/LTO.h @@ -23,6 +23,7 @@ #include "lld/Core/LLVM.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringSet.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Linker/IRMover.h" @@ -44,6 +45,7 @@ llvm::IRMover Mover{Combined}; SmallString<0> OwningData; std::unique_ptr MB; + llvm::StringSet<> Internalize; }; } } Index: ELF/LTO.cpp =================================================================== --- ELF/LTO.cpp +++ ELF/LTO.cpp @@ -15,6 +15,7 @@ #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/Linker/IRMover.h" #include "llvm/Support/StringSaver.h" @@ -22,6 +23,7 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/PassManagerBuilder.h" +#include "llvm/Transforms/Utils/ModuleUtils.h" using namespace llvm; using namespace llvm::object; @@ -75,6 +77,13 @@ unsigned BodyIndex = 0; ArrayRef Bodies = F.getSymbols(); + Module &M = Obj->getModule(); + M.materializeMetadata(); + UpgradeDebugInfo(M); + + SmallPtrSet Used; + collectUsedGlobalVariables(M, Used, /* CompilerUsed */ false); + for (const BasicSymbolRef &Sym : Obj->symbols()) { GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl()); assert(GV); @@ -95,6 +104,12 @@ GV->setLinkage(GlobalValue::WeakODRLinkage); break; } + + // FIXME: Is the check for shared libraries correct? + if (!Config->Shared && !Used.count(GV) && + !cast(B)->isReferencedFromOutside()) + Internalize.insert(GV->getName()); + Keep.push_back(GV); } } @@ -104,10 +119,22 @@ [](GlobalValue &, IRMover::ValueAdder) {}); } +static void internalize(GlobalValue &GV) { + if (!GV.hasLocalLinkage()) + GV.setLinkage(GlobalValue::InternalLinkage); +} + // Merge all the bitcode files we have seen, codegen the result // and return the resulting ObjectFile. template std::unique_ptr> BitcodeCompiler::compile() { + + for (const auto &Name : Internalize) { + GlobalValue *GV = Combined.getNamedValue(Name.first()); + if (GV) + internalize(*GV); + } + if (Config->SaveTemps) saveBCFile(Combined, ".lto.bc"); Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -214,6 +214,14 @@ SymbolBody *Existing = Sym->Body; + // Needed for internalize step of symbols. + if (auto *BC = dyn_cast(Existing)) + if (auto *U = dyn_cast(New)) + BC->setReferencedFromOutside(); + if (auto *U = dyn_cast(Existing)) + if (auto *BC = dyn_cast(New)) + BC->setReferencedFromOutside(); + if (Lazy *L = dyn_cast(Existing)) { if (auto *Undef = dyn_cast(New)) { addMemberFile(Undef, L); Index: ELF/Symbols.h =================================================================== --- ELF/Symbols.h +++ ELF/Symbols.h @@ -180,6 +180,12 @@ public: DefinedBitcode(StringRef Name, bool IsWeak, uint8_t Visibility); static bool classof(const SymbolBody *S); + + void setReferencedFromOutside() { RefFromOutside = true; } + bool isReferencedFromOutside() { return RefFromOutside; } + +private: + bool RefFromOutside; }; class DefinedCommon : public Defined { Index: ELF/Symbols.cpp =================================================================== --- ELF/Symbols.cpp +++ ELF/Symbols.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/Config/config.h" +#include "llvm/Support/raw_ostream.h" #ifdef HAVE_CXXABI_H #include Index: test/ELF/lto/internalize.ll =================================================================== --- /dev/null +++ test/ELF/lto/internalize.ll @@ -0,0 +1,17 @@ +; REQUIRES: x86 +; RUN: llvm-as %s -o %t.o +; RUN: ld.lld -m elf_x86_64 %t.o -o %t2 -save-temps +; RUN: llvm-dis %t2 -o - | FileCheck %s + +; CHECK: blah + +target triple = "x86_64-unknown-linux-gnu" +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @_start() { + ret void +} + +define void @foo() { + ret void +}