[ThinLTO] Add an auto-hide feature
When a symbol is not exported outside of the
DSO, it is can be hidden. Usually we try to internalize
as much as possible, but it is not always possible, for
instance a symbol can be referenced outside of the LTO
unit, or there can be cross-module reference in ThinLTO.
This is a recommit of r293912 after fixing build failures.
Differential Revision: https://reviews.llvm.org/D28978
llvm-svn: 293918
diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp
index df19ded..51b7e7d 100644
--- a/llvm/lib/LTO/LTO.cpp
+++ b/llvm/lib/LTO/LTO.cpp
@@ -199,11 +199,14 @@
static void thinLTOInternalizeAndPromoteGUID(
GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID,
- function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
+ function_ref<SummaryResolution(StringRef, GlobalValue::GUID)> isExported) {
for (auto &S : GVSummaryList) {
- if (isExported(S->modulePath(), GUID)) {
+ auto ExportResolution = isExported(S->modulePath(), GUID);
+ if (ExportResolution != Internal) {
if (GlobalValue::isLocalLinkage(S->linkage()))
S->setLinkage(GlobalValue::ExternalLinkage);
+ if (ExportResolution == Hidden)
+ S->setAutoHide();
} else if (!GlobalValue::isLocalLinkage(S->linkage()))
S->setLinkage(GlobalValue::InternalLinkage);
}
@@ -213,7 +216,7 @@
// as external and non-exported values as internal.
void llvm::thinLTOInternalizeAndPromoteInIndex(
ModuleSummaryIndex &Index,
- function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
+ function_ref<SummaryResolution(StringRef, GlobalValue::GUID)> isExported) {
for (auto &I : Index)
thinLTOInternalizeAndPromoteGUID(I.second, I.first, isExported);
}
@@ -921,11 +924,20 @@
const GlobalValueSummary *S) {
return ThinLTO.PrevailingModuleForGUID[GUID] == S->modulePath();
};
- auto isExported = [&](StringRef ModuleIdentifier, GlobalValue::GUID GUID) {
+ auto isExported = [&](StringRef ModuleIdentifier,
+ GlobalValue::GUID GUID) -> SummaryResolution {
const auto &ExportList = ExportLists.find(ModuleIdentifier);
- return (ExportList != ExportLists.end() &&
- ExportList->second.count(GUID)) ||
- ExportedGUIDs.count(GUID);
+ if ((ExportList != ExportLists.end() && ExportList->second.count(GUID)) ||
+ ExportedGUIDs.count(GUID)) {
+ // We could do better by hiding when a symbol is in
+ // GUIDPreservedSymbols because it is only referenced from regular LTO
+ // or from native files and not outside the final binary, but that's
+ // something the native linker could do as gwell.
+ if (GUIDPreservedSymbols.count(GUID))
+ return Exported;
+ return Hidden;
+ }
+ return Internal;
};
thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported);