forked from OSchip/llvm-project
LTO: Include dso-local bit in ThinLTO cache key.
Differential Revision: https://reviews.llvm.org/D42713 llvm-svn: 324253
This commit is contained in:
parent
2329fcd293
commit
b4edfb9af9
|
@ -158,6 +158,8 @@ struct ValueInfo {
|
|||
const GlobalValueSummaryMapTy::value_type *getRef() const {
|
||||
return RefAndFlag.getPointer();
|
||||
}
|
||||
|
||||
bool isDSOLocal() const;
|
||||
};
|
||||
|
||||
template <> struct DenseMapInfo<ValueInfo> {
|
||||
|
|
|
@ -17,6 +17,15 @@
|
|||
#include "llvm/Support/Path.h"
|
||||
using namespace llvm;
|
||||
|
||||
bool ValueInfo::isDSOLocal() const {
|
||||
// Need to check all summaries are local in case of hash collisions.
|
||||
return getSummaryList().size() &&
|
||||
llvm::all_of(getSummaryList(),
|
||||
[](const std::unique_ptr<GlobalValueSummary> &Summary) {
|
||||
return Summary->isDSOLocal();
|
||||
});
|
||||
}
|
||||
|
||||
// Collect for the given module the list of function it defines
|
||||
// (GUID -> Summary).
|
||||
void ModuleSummaryIndex::collectDefinedFunctionsForModule(
|
||||
|
|
|
@ -177,8 +177,10 @@ static void computeCacheKey(
|
|||
|
||||
auto AddUsedThings = [&](GlobalValueSummary *GS) {
|
||||
if (!GS) return;
|
||||
for (const ValueInfo &VI : GS->refs())
|
||||
for (const ValueInfo &VI : GS->refs()) {
|
||||
AddUnsigned(VI.isDSOLocal());
|
||||
AddUsedCfiGlobal(VI.getGUID());
|
||||
}
|
||||
if (auto *FS = dyn_cast<FunctionSummary>(GS)) {
|
||||
for (auto &TT : FS->type_tests())
|
||||
UsedTypeIds.insert(TT);
|
||||
|
|
|
@ -206,16 +206,8 @@ void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
|
|||
// definition.
|
||||
if (GV.hasName()) {
|
||||
ValueInfo VI = ImportIndex.getValueInfo(GV.getGUID());
|
||||
if (VI) {
|
||||
// Need to check all summaries are local in case of hash collisions.
|
||||
bool IsLocal = VI.getSummaryList().size() &&
|
||||
llvm::all_of(VI.getSummaryList(),
|
||||
[](const std::unique_ptr<GlobalValueSummary> &Summary) {
|
||||
return Summary->isDSOLocal();
|
||||
});
|
||||
if (IsLocal)
|
||||
GV.setDSOLocal(true);
|
||||
}
|
||||
if (VI && VI.isDSOLocal())
|
||||
GV.setDSOLocal(true);
|
||||
}
|
||||
|
||||
bool DoPromote = false;
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
; Tests whether the cache is sensitive to the dso-local bit on referenced
|
||||
; globals.
|
||||
; RUN: rm -rf %t.cache
|
||||
; RUN: opt -module-hash -module-summary -o %t.bc %s
|
||||
; RUN: llvm-lto2 run -o %t.o %t.bc -cache-dir %t.cache \
|
||||
; RUN: -r %t.bc,foo,px \
|
||||
; RUN: -r %t.bc,bar,px
|
||||
; RUN: llvm-lto2 run -o %t.o %t.bc -cache-dir %t.cache \
|
||||
; RUN: -r %t.bc,foo,plx \
|
||||
; RUN: -r %t.bc,bar,px
|
||||
; RUN: ls %t.cache | count 2
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
define weak void @foo() {
|
||||
ret void
|
||||
}
|
||||
|
||||
define weak void()* @bar() {
|
||||
ret void()* @foo
|
||||
}
|
Loading…
Reference in New Issue