mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
[ThinLTO/gold] ThinLTO internalization fixes
Internalization was missing cases where we originally had a local symbol that was promoted eagerly but not actually exported. This is because we were only internalizing the set of global (non-local) symbols that were PREVAILAING_DEF_IRONLY. Instead, collect the set of global symbols that are referenced outside of a single IR file, and skip internalization for those. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275247 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
17c5ce914c
commit
90c5cb8752
@ -62,6 +62,8 @@
|
||||
; BACKEND1-NEXT: </MODULE_STRTAB_BLOCK
|
||||
; BACKEND1-NEXT: <GLOBALVAL_SUMMARY_BLOCK
|
||||
; BACKEND1-NEXT: <VERSION
|
||||
; One of these will be a COMBINED_ORIGINAL_NAME since f can be internalized.
|
||||
; BACKEND1-NEXT: <COMBINED
|
||||
; BACKEND1-NEXT: <COMBINED
|
||||
; BACKEND1-NEXT: <COMBINED
|
||||
; BACKEND1-NEXT: </GLOBALVAL_SUMMARY_BLOCK
|
||||
|
@ -11,11 +11,18 @@
|
||||
; f() should be internalized and eliminated after inlining
|
||||
; CHECK-NOT: @f()
|
||||
|
||||
; h() should be internalized after promotion, and eliminated after inlining
|
||||
; CHECK-NOT: @h.llvm.
|
||||
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
define i32 @g() {
|
||||
call void @f()
|
||||
call void @h()
|
||||
ret i32 0
|
||||
}
|
||||
define void @f() {
|
||||
ret void
|
||||
}
|
||||
define internal void @h() {
|
||||
ret void
|
||||
}
|
||||
|
@ -1323,10 +1323,9 @@ static ld_plugin_status thinLTOLink(raw_fd_ostream *ApiFile) {
|
||||
// interfaces with gold.
|
||||
DenseMap<void *, std::unique_ptr<PluginInputFile>> HandleToInputFile;
|
||||
|
||||
// Keep track of internalization candidates as well as those that may not
|
||||
// be internalized because they are refereneced from other IR modules.
|
||||
DenseSet<GlobalValue::GUID> Internalize;
|
||||
DenseSet<GlobalValue::GUID> CrossReferenced;
|
||||
// Keep track of symbols that must not be internalized because they
|
||||
// are referenced outside of a single IR module.
|
||||
DenseSet<GlobalValue::GUID> Preserve;
|
||||
|
||||
ModuleSummaryIndex CombinedIndex;
|
||||
uint64_t NextModuleId = 0;
|
||||
@ -1352,23 +1351,17 @@ static ld_plugin_status thinLTOLink(raw_fd_ostream *ApiFile) {
|
||||
if (Index)
|
||||
CombinedIndex.mergeFrom(std::move(Index), ++NextModuleId);
|
||||
|
||||
// Look for internalization candidates based on gold's symbol resolution
|
||||
// information. Also track symbols referenced from other IR modules.
|
||||
// Use gold's symbol resolution information to identify symbols referenced
|
||||
// by more than a single IR module (before importing, which is checked
|
||||
// separately).
|
||||
for (auto &Sym : F.syms) {
|
||||
ld_plugin_symbol_resolution Resolution =
|
||||
(ld_plugin_symbol_resolution)Sym.resolution;
|
||||
if (Resolution == LDPR_PREVAILING_DEF_IRONLY)
|
||||
Internalize.insert(GlobalValue::getGUID(Sym.name));
|
||||
if (Resolution == LDPR_RESOLVED_IR || Resolution == LDPR_PREEMPTED_IR)
|
||||
CrossReferenced.insert(GlobalValue::getGUID(Sym.name));
|
||||
if (Resolution != LDPR_PREVAILING_DEF_IRONLY)
|
||||
Preserve.insert(GlobalValue::getGUID(Sym.name));
|
||||
}
|
||||
}
|
||||
|
||||
// Remove symbols referenced from other IR modules from the internalization
|
||||
// candidate set.
|
||||
for (auto &S : CrossReferenced)
|
||||
Internalize.erase(S);
|
||||
|
||||
// Collect for each module the list of function it defines (GUID ->
|
||||
// Summary).
|
||||
StringMap<std::map<GlobalValue::GUID, GlobalValueSummary *>>
|
||||
@ -1387,7 +1380,7 @@ static ld_plugin_status thinLTOLink(raw_fd_ostream *ApiFile) {
|
||||
const auto &ExportList = ExportLists.find(ModuleIdentifier);
|
||||
return (ExportList != ExportLists.end() &&
|
||||
ExportList->second.count(GUID)) ||
|
||||
!Internalize.count(GUID);
|
||||
Preserve.count(GUID);
|
||||
};
|
||||
|
||||
// Use global summary-based analysis to identify symbols that can be
|
||||
|
Loading…
Reference in New Issue
Block a user