[lld] r264585 - [LTO] Internalize symbols.
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 28 08:44:22 PDT 2016
Author: davide
Date: Mon Mar 28 10:44:21 2016
New Revision: 264585
URL: http://llvm.org/viewvc/llvm-project?rev=264585&view=rev
Log:
[LTO] Internalize symbols.
IPO doesn't work very well across symbols referenced
by others TUs. The linker here tries to evaluate
which symbols are safe to internalize and switches
their linkage.
Differential Revision: http://reviews.llvm.org/D18415
Added:
lld/trunk/test/ELF/lto/internalize-basic.ll
Modified:
lld/trunk/ELF/LTO.cpp
lld/trunk/ELF/LTO.h
lld/trunk/ELF/Symbols.h
Modified: lld/trunk/ELF/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=264585&r1=264584&r2=264585&view=diff
==============================================================================
--- lld/trunk/ELF/LTO.cpp (original)
+++ lld/trunk/ELF/LTO.cpp Mon Mar 28 10:44:21 2016
@@ -97,6 +97,18 @@ void BitcodeCompiler::add(BitcodeFile &F
GV->setLinkage(GlobalValue::WeakODRLinkage);
break;
}
+
+ // We collect the set of symbols we want to internalize here
+ // and change the linkage after the IRMover executed, i.e. after
+ // we imported the symbols and satisfied undefined references
+ // to it. We can't just change linkage here because otherwise
+ // the IRMover will just rename the symbol.
+ // Shared libraries need to be handled slightly differently.
+ // For now, let's be conservative and just never internalize
+ // symbols when creating a shared library.
+ if (!Config->Shared && !B->isUsedInRegularObj())
+ InternalizedSyms.insert(GV->getName());
+
Keep.push_back(GV);
}
@@ -104,10 +116,22 @@ void BitcodeCompiler::add(BitcodeFile &F
[](GlobalValue &, IRMover::ValueAdder) {});
}
+static void internalize(GlobalValue &GV) {
+ assert(!GV.hasLocalLinkage() &&
+ "Trying to internalize a symbol with local linkage!") ;
+ GV.setLinkage(GlobalValue::InternalLinkage);
+}
+
// Merge all the bitcode files we have seen, codegen the result
// and return the resulting ObjectFile.
template <class ELFT>
std::unique_ptr<elf::ObjectFile<ELFT>> BitcodeCompiler::compile() {
+ for (const auto &Name : InternalizedSyms) {
+ GlobalValue *GV = Combined.getNamedValue(Name.first());
+ assert(GV);
+ internalize(*GV);
+ }
+
if (Config->SaveTemps)
saveBCFile(Combined, ".lto.bc");
Modified: lld/trunk/ELF/LTO.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.h?rev=264585&r1=264584&r2=264585&view=diff
==============================================================================
--- lld/trunk/ELF/LTO.h (original)
+++ lld/trunk/ELF/LTO.h Mon Mar 28 10:44:21 2016
@@ -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"
@@ -46,6 +47,7 @@ private:
llvm::IRMover Mover{Combined};
SmallString<0> OwningData;
std::unique_ptr<MemoryBuffer> MB;
+ llvm::StringSet<> InternalizedSyms;
};
}
}
Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=264585&r1=264584&r2=264585&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Mon Mar 28 10:44:21 2016
@@ -120,7 +120,8 @@ protected:
IsFunc = Type == llvm::ELF::STT_FUNC;
IsTls = Type == llvm::ELF::STT_TLS;
IsGnuIFunc = Type == llvm::ELF::STT_GNU_IFUNC;
- IsUsedInRegularObj = K != SharedKind && K != LazyKind;
+ IsUsedInRegularObj =
+ K != SharedKind && K != LazyKind && K != DefinedBitcodeKind;
}
const unsigned SymbolKind : 8;
Added: lld/trunk/test/ELF/lto/internalize-basic.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/internalize-basic.ll?rev=264585&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/internalize-basic.ll (added)
+++ lld/trunk/test/ELF/lto/internalize-basic.ll Mon Mar 28 10:44:21 2016
@@ -0,0 +1,21 @@
+; 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.lto.bc | FileCheck %s
+
+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 hidden void @foo() {
+ ret void
+}
+
+; Check that _start is not internalized.
+; CHECK: define void @_start()
+
+; Check that foo function is correctly internalized.
+; CHECK: define internal void @foo()
More information about the llvm-commits
mailing list