mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[ThinLTO] Auto-hide prevailing linkonce_odr only when all copies eligible
Summary: We hit undefined references building with ThinLTO when one source file contained explicit instantiations of a template method (weak_odr) but there were also implicit instantiations in another file (linkonce_odr), and the latter was the prevailing copy. In this case the symbol was marked hidden when the prevailing linkonce_odr copy was promoted to weak_odr. It led to unsats when the resulting shared library was linked with other code that contained a reference (expecting to be resolved due to the explicit instantiation). Add a CanAutoHide flag to the GV summary to allow the thin link to identify when all copies are eligible for auto-hiding (because they were all originally linkonce_odr global unnamed addr), and only do the auto-hide in that case. Most of the changes here are due to plumbing the new flag through the bitcode and llvm assembly, and resulting test changes. I augmented the existing auto-hide test to check for this situation. Reviewers: pcc Subscribers: mehdi_amini, inglorion, eraman, dexonsmith, arphaman, dang, llvm-commits, steven_wu, wmi Tags: #llvm Differential Revision: https://reviews.llvm.org/D59709 llvm-svn: 360466
This commit is contained in:
parent
bbfa642e0c
commit
69b4df22e0
@ -197,6 +197,9 @@ struct ValueInfo {
|
||||
}
|
||||
|
||||
bool isDSOLocal() const;
|
||||
|
||||
/// Checks if all copies are eligible for auto-hiding (have flag set).
|
||||
bool canAutoHide() const;
|
||||
};
|
||||
|
||||
inline raw_ostream &operator<<(raw_ostream &OS, const ValueInfo &VI) {
|
||||
@ -279,11 +282,23 @@ public:
|
||||
/// within the same linkage unit.
|
||||
unsigned DSOLocal : 1;
|
||||
|
||||
/// In the per-module summary, indicates that the global value is
|
||||
/// linkonce_odr and global unnamed addr (so eligible for auto-hiding
|
||||
/// via hidden visibility). In the combined summary, indicates that the
|
||||
/// prevailing linkonce_odr copy can be auto-hidden via hidden visibility
|
||||
/// when it is upgraded to weak_odr in the backend. This is legal when
|
||||
/// all copies are eligible for auto-hiding (i.e. all copies were
|
||||
/// linkonce_odr global unnamed addr. If any copy is not (e.g. it was
|
||||
/// originally weak_odr, we cannot auto-hide the prevailing copy as it
|
||||
/// means the symbol was externally visible.
|
||||
unsigned CanAutoHide : 1;
|
||||
|
||||
/// Convenience Constructors
|
||||
explicit GVFlags(GlobalValue::LinkageTypes Linkage,
|
||||
bool NotEligibleToImport, bool Live, bool IsLocal)
|
||||
bool NotEligibleToImport, bool Live, bool IsLocal,
|
||||
bool CanAutoHide)
|
||||
: Linkage(Linkage), NotEligibleToImport(NotEligibleToImport),
|
||||
Live(Live), DSOLocal(IsLocal) {}
|
||||
Live(Live), DSOLocal(IsLocal), CanAutoHide(CanAutoHide) {}
|
||||
};
|
||||
|
||||
private:
|
||||
@ -364,6 +379,10 @@ public:
|
||||
|
||||
bool isDSOLocal() const { return Flags.DSOLocal; }
|
||||
|
||||
void setCanAutoHide(bool CanAutoHide) { Flags.CanAutoHide = CanAutoHide; }
|
||||
|
||||
bool canAutoHide() const { return Flags.CanAutoHide; }
|
||||
|
||||
/// Flag that this global value cannot be imported.
|
||||
void setNotEligibleToImport() { Flags.NotEligibleToImport = true; }
|
||||
|
||||
@ -512,7 +531,8 @@ public:
|
||||
return FunctionSummary(
|
||||
FunctionSummary::GVFlags(
|
||||
GlobalValue::LinkageTypes::AvailableExternallyLinkage,
|
||||
/*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false),
|
||||
/*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false,
|
||||
/*CanAutoHide=*/false),
|
||||
/*InsCount=*/0, FunctionSummary::FFlags{}, /*EntryCount=*/0,
|
||||
std::vector<ValueInfo>(), std::move(Edges),
|
||||
std::vector<GlobalValue::GUID>(),
|
||||
|
@ -136,7 +136,7 @@ template <> struct MappingTraits<TypeIdSummary> {
|
||||
|
||||
struct FunctionSummaryYaml {
|
||||
unsigned Linkage;
|
||||
bool NotEligibleToImport, Live, IsLocal;
|
||||
bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
|
||||
std::vector<uint64_t> Refs;
|
||||
std::vector<uint64_t> TypeTests;
|
||||
std::vector<FunctionSummary::VFuncId> TypeTestAssumeVCalls,
|
||||
@ -180,6 +180,7 @@ template <> struct MappingTraits<FunctionSummaryYaml> {
|
||||
io.mapOptional("NotEligibleToImport", summary.NotEligibleToImport);
|
||||
io.mapOptional("Live", summary.Live);
|
||||
io.mapOptional("Local", summary.IsLocal);
|
||||
io.mapOptional("CanAutoHide", summary.CanAutoHide);
|
||||
io.mapOptional("Refs", summary.Refs);
|
||||
io.mapOptional("TypeTests", summary.TypeTests);
|
||||
io.mapOptional("TypeTestAssumeVCalls", summary.TypeTestAssumeVCalls);
|
||||
@ -222,7 +223,7 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
Elem.SummaryList.push_back(llvm::make_unique<FunctionSummary>(
|
||||
GlobalValueSummary::GVFlags(
|
||||
static_cast<GlobalValue::LinkageTypes>(FSum.Linkage),
|
||||
FSum.NotEligibleToImport, FSum.Live, FSum.IsLocal),
|
||||
FSum.NotEligibleToImport, FSum.Live, FSum.IsLocal, FSum.CanAutoHide),
|
||||
/*NumInsts=*/0, FunctionSummary::FFlags{}, /*EntryCount=*/0, Refs,
|
||||
ArrayRef<FunctionSummary::EdgeTy>{}, std::move(FSum.TypeTests),
|
||||
std::move(FSum.TypeTestAssumeVCalls),
|
||||
@ -243,7 +244,8 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
FSum->flags().Linkage,
|
||||
static_cast<bool>(FSum->flags().NotEligibleToImport),
|
||||
static_cast<bool>(FSum->flags().Live),
|
||||
static_cast<bool>(FSum->flags().DSOLocal), Refs,
|
||||
static_cast<bool>(FSum->flags().DSOLocal),
|
||||
static_cast<bool>(FSum->flags().CanAutoHide), Refs,
|
||||
FSum->type_tests(), FSum->type_test_assume_vcalls(),
|
||||
FSum->type_checked_load_vcalls(),
|
||||
FSum->type_test_assume_const_vcalls(),
|
||||
|
@ -50,7 +50,8 @@ void thinLTOResolvePrevailingInIndex(
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing,
|
||||
function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
|
||||
recordNewLinkage);
|
||||
recordNewLinkage,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols);
|
||||
|
||||
/// Update the linkages in the given \p Index to mark exported values
|
||||
/// as external and non-exported values as internal. The ThinLTO backends
|
||||
@ -405,7 +406,8 @@ private:
|
||||
const SymbolResolution *&ResI, const SymbolResolution *ResE);
|
||||
|
||||
Error runRegularLTO(AddStreamFn AddStream);
|
||||
Error runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache);
|
||||
Error runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols);
|
||||
|
||||
Error checkPartiallySplit();
|
||||
|
||||
|
@ -391,7 +391,8 @@ static void computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M,
|
||||
bool NotEligibleForImport =
|
||||
NonRenamableLocal || HasInlineAsmMaybeReferencingInternal;
|
||||
GlobalValueSummary::GVFlags Flags(F.getLinkage(), NotEligibleForImport,
|
||||
/* Live = */ false, F.isDSOLocal());
|
||||
/* Live = */ false, F.isDSOLocal(),
|
||||
F.hasLinkOnceODRLinkage() && F.hasGlobalUnnamedAddr());
|
||||
FunctionSummary::FFlags FunFlags{
|
||||
F.hasFnAttribute(Attribute::ReadNone),
|
||||
F.hasFnAttribute(Attribute::ReadOnly),
|
||||
@ -418,7 +419,8 @@ computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V,
|
||||
bool HasBlockAddress = findRefEdges(Index, &V, RefEdges, Visited);
|
||||
bool NonRenamableLocal = isNonRenamableLocal(V);
|
||||
GlobalValueSummary::GVFlags Flags(V.getLinkage(), NonRenamableLocal,
|
||||
/* Live = */ false, V.isDSOLocal());
|
||||
/* Live = */ false, V.isDSOLocal(),
|
||||
V.hasLinkOnceODRLinkage() && V.hasGlobalUnnamedAddr());
|
||||
|
||||
// Don't mark variables we won't be able to internalize as read-only.
|
||||
GlobalVarSummary::GVarFlags VarFlags(
|
||||
@ -438,7 +440,8 @@ computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A,
|
||||
DenseSet<GlobalValue::GUID> &CantBePromoted) {
|
||||
bool NonRenamableLocal = isNonRenamableLocal(A);
|
||||
GlobalValueSummary::GVFlags Flags(A.getLinkage(), NonRenamableLocal,
|
||||
/* Live = */ false, A.isDSOLocal());
|
||||
/* Live = */ false, A.isDSOLocal(),
|
||||
A.hasLinkOnceODRLinkage() && A.hasGlobalUnnamedAddr());
|
||||
auto AS = llvm::make_unique<AliasSummary>(Flags);
|
||||
auto *Aliasee = A.getBaseObject();
|
||||
auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
|
||||
@ -513,7 +516,8 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
|
||||
GlobalValueSummary::GVFlags GVFlags(GlobalValue::InternalLinkage,
|
||||
/* NotEligibleToImport = */ true,
|
||||
/* Live = */ true,
|
||||
/* Local */ GV->isDSOLocal());
|
||||
/* Local */ GV->isDSOLocal(),
|
||||
GV->hasLinkOnceODRLinkage() && GV->hasGlobalUnnamedAddr());
|
||||
CantBePromoted.insert(GV->getGUID());
|
||||
// Create the appropriate summary type.
|
||||
if (Function *F = dyn_cast<Function>(GV)) {
|
||||
|
@ -733,6 +733,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
KEYWORD(notEligibleToImport);
|
||||
KEYWORD(live);
|
||||
KEYWORD(dsoLocal);
|
||||
KEYWORD(canAutoHide);
|
||||
KEYWORD(function);
|
||||
KEYWORD(insts);
|
||||
KEYWORD(funcFlags);
|
||||
|
@ -7859,7 +7859,7 @@ bool LLParser::ParseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
StringRef ModulePath;
|
||||
GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage, /*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false);
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false);
|
||||
unsigned InstCount;
|
||||
std::vector<FunctionSummary::EdgeTy> Calls;
|
||||
FunctionSummary::TypeIdInfo TypeIdInfo;
|
||||
@ -7929,7 +7929,7 @@ bool LLParser::ParseVariableSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
StringRef ModulePath;
|
||||
GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage, /*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false);
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false);
|
||||
GlobalVarSummary::GVarFlags GVarFlags(/*ReadOnly*/ false);
|
||||
std::vector<ValueInfo> Refs;
|
||||
if (ParseToken(lltok::colon, "expected ':' here") ||
|
||||
@ -7972,7 +7972,7 @@ bool LLParser::ParseAliasSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
StringRef ModulePath;
|
||||
GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage, /*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false);
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false);
|
||||
if (ParseToken(lltok::colon, "expected ':' here") ||
|
||||
ParseToken(lltok::lparen, "expected '(' here") ||
|
||||
ParseModuleReference(ModulePath) ||
|
||||
@ -8462,41 +8462,55 @@ bool LLParser::ParseVFuncId(FunctionSummary::VFuncId &VFuncId,
|
||||
/// GVFlags
|
||||
/// ::= 'flags' ':' '(' 'linkage' ':' OptionalLinkageAux ','
|
||||
/// 'notEligibleToImport' ':' Flag ',' 'live' ':' Flag ','
|
||||
/// 'dsoLocal' ':' Flag ')'
|
||||
/// 'dsoLocal' ':' Flag ',' 'canAutoHide' ':' Flag ')'
|
||||
bool LLParser::ParseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
|
||||
assert(Lex.getKind() == lltok::kw_flags);
|
||||
Lex.Lex();
|
||||
|
||||
bool HasLinkage;
|
||||
if (ParseToken(lltok::colon, "expected ':' here") ||
|
||||
ParseToken(lltok::lparen, "expected '(' here") ||
|
||||
ParseToken(lltok::kw_linkage, "expected 'linkage' here") ||
|
||||
ParseToken(lltok::colon, "expected ':' here"))
|
||||
ParseToken(lltok::lparen, "expected '(' here"))
|
||||
return true;
|
||||
|
||||
do {
|
||||
unsigned Flag;
|
||||
switch (Lex.getKind()) {
|
||||
case lltok::kw_linkage:
|
||||
Lex.Lex();
|
||||
if (ParseToken(lltok::colon, "expected ':'"))
|
||||
return true;
|
||||
bool HasLinkage;
|
||||
GVFlags.Linkage = parseOptionalLinkageAux(Lex.getKind(), HasLinkage);
|
||||
assert(HasLinkage && "Linkage not optional in summary entry");
|
||||
Lex.Lex();
|
||||
|
||||
unsigned Flag;
|
||||
if (ParseToken(lltok::comma, "expected ',' here") ||
|
||||
ParseToken(lltok::kw_notEligibleToImport,
|
||||
"expected 'notEligibleToImport' here") ||
|
||||
ParseToken(lltok::colon, "expected ':' here") || ParseFlag(Flag))
|
||||
break;
|
||||
case lltok::kw_notEligibleToImport:
|
||||
Lex.Lex();
|
||||
if (ParseToken(lltok::colon, "expected ':'") || ParseFlag(Flag))
|
||||
return true;
|
||||
GVFlags.NotEligibleToImport = Flag;
|
||||
|
||||
if (ParseToken(lltok::comma, "expected ',' here") ||
|
||||
ParseToken(lltok::kw_live, "expected 'live' here") ||
|
||||
ParseToken(lltok::colon, "expected ':' here") || ParseFlag(Flag))
|
||||
break;
|
||||
case lltok::kw_live:
|
||||
Lex.Lex();
|
||||
if (ParseToken(lltok::colon, "expected ':'") || ParseFlag(Flag))
|
||||
return true;
|
||||
GVFlags.Live = Flag;
|
||||
|
||||
if (ParseToken(lltok::comma, "expected ',' here") ||
|
||||
ParseToken(lltok::kw_dsoLocal, "expected 'dsoLocal' here") ||
|
||||
ParseToken(lltok::colon, "expected ':' here") || ParseFlag(Flag))
|
||||
break;
|
||||
case lltok::kw_dsoLocal:
|
||||
Lex.Lex();
|
||||
if (ParseToken(lltok::colon, "expected ':'") || ParseFlag(Flag))
|
||||
return true;
|
||||
GVFlags.DSOLocal = Flag;
|
||||
break;
|
||||
case lltok::kw_canAutoHide:
|
||||
Lex.Lex();
|
||||
if (ParseToken(lltok::colon, "expected ':'") || ParseFlag(Flag))
|
||||
return true;
|
||||
GVFlags.CanAutoHide = Flag;
|
||||
break;
|
||||
default:
|
||||
return Error(Lex.getLoc(), "expected gv flag type");
|
||||
}
|
||||
} while (EatIfPresent(lltok::comma));
|
||||
|
||||
if (ParseToken(lltok::rparen, "expected ')' here"))
|
||||
return true;
|
||||
|
@ -364,6 +364,7 @@ enum Kind {
|
||||
kw_notEligibleToImport,
|
||||
kw_live,
|
||||
kw_dsoLocal,
|
||||
kw_canAutoHide,
|
||||
kw_function,
|
||||
kw_insts,
|
||||
kw_funcFlags,
|
||||
|
@ -893,8 +893,9 @@ static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags,
|
||||
// values as live.
|
||||
bool Live = (RawFlags & 0x2) || Version < 3;
|
||||
bool Local = (RawFlags & 0x4);
|
||||
bool AutoHide = (RawFlags & 0x8);
|
||||
|
||||
return GlobalValueSummary::GVFlags(Linkage, NotEligibleToImport, Live, Local);
|
||||
return GlobalValueSummary::GVFlags(Linkage, NotEligibleToImport, Live, Local, AutoHide);
|
||||
}
|
||||
|
||||
// Decode the flags for GlobalVariable in the summary
|
||||
|
@ -996,6 +996,7 @@ static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) {
|
||||
RawFlags |= Flags.NotEligibleToImport; // bool
|
||||
RawFlags |= (Flags.Live << 1);
|
||||
RawFlags |= (Flags.DSOLocal << 2);
|
||||
RawFlags |= (Flags.CanAutoHide << 3);
|
||||
|
||||
// Linkage don't need to be remapped at that time for the summary. Any future
|
||||
// change to the getEncodedLinkage() function will need to be taken into
|
||||
|
@ -3041,6 +3041,7 @@ void AssemblyWriter::printSummary(const GlobalValueSummary &Summary) {
|
||||
Out << ", notEligibleToImport: " << GVFlags.NotEligibleToImport;
|
||||
Out << ", live: " << GVFlags.Live;
|
||||
Out << ", dsoLocal: " << GVFlags.DSOLocal;
|
||||
Out << ", canAutoHide: " << GVFlags.CanAutoHide;
|
||||
Out << ")";
|
||||
|
||||
if (Summary.getSummaryKind() == GlobalValueSummary::AliasKind)
|
||||
|
@ -26,6 +26,7 @@ STATISTIC(ReadOnlyLiveGVars,
|
||||
|
||||
FunctionSummary FunctionSummary::ExternalNode =
|
||||
FunctionSummary::makeDummyFunctionSummary({});
|
||||
|
||||
bool ValueInfo::isDSOLocal() const {
|
||||
// Need to check all summaries are local in case of hash collisions.
|
||||
return getSummaryList().size() &&
|
||||
@ -35,6 +36,15 @@ bool ValueInfo::isDSOLocal() const {
|
||||
});
|
||||
}
|
||||
|
||||
bool ValueInfo::canAutoHide() const {
|
||||
// Can only auto hide if all copies are eligible to auto hide.
|
||||
return getSummaryList().size() &&
|
||||
llvm::all_of(getSummaryList(),
|
||||
[](const std::unique_ptr<GlobalValueSummary> &Summary) {
|
||||
return Summary->canAutoHide();
|
||||
});
|
||||
}
|
||||
|
||||
// Gets the number of immutable refs in RefEdgeList
|
||||
unsigned FunctionSummary::immutableRefCount() const {
|
||||
// Here we take advantage of having all readonly references
|
||||
@ -399,6 +409,10 @@ void ModuleSummaryIndex::exportToDot(raw_ostream &OS) const {
|
||||
if (Flags.Live && hasReadOnlyFlag(SummaryIt.second))
|
||||
A.addComment("immutable");
|
||||
}
|
||||
if (Flags.DSOLocal)
|
||||
A.addComment("dsoLocal");
|
||||
if (Flags.CanAutoHide)
|
||||
A.addComment("canAutoHide");
|
||||
|
||||
auto VI = getValueInfo(SummaryIt.first);
|
||||
A.add("label", getNodeLabel(VI, SummaryIt.second));
|
||||
|
@ -187,6 +187,7 @@ void llvm::computeLTOCacheKey(
|
||||
auto AddUsedThings = [&](GlobalValueSummary *GS) {
|
||||
if (!GS) return;
|
||||
AddUnsigned(GS->isLive());
|
||||
AddUnsigned(GS->canAutoHide());
|
||||
for (const ValueInfo &VI : GS->refs()) {
|
||||
AddUnsigned(VI.isDSOLocal());
|
||||
AddUsedCfiGlobal(VI.getGUID());
|
||||
@ -295,13 +296,13 @@ void llvm::computeLTOCacheKey(
|
||||
}
|
||||
|
||||
static void thinLTOResolvePrevailingGUID(
|
||||
GlobalValueSummaryList &GVSummaryList, GlobalValue::GUID GUID,
|
||||
DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias,
|
||||
ValueInfo VI, DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing,
|
||||
function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
|
||||
recordNewLinkage) {
|
||||
for (auto &S : GVSummaryList) {
|
||||
recordNewLinkage,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
|
||||
for (auto &S : VI.getSummaryList()) {
|
||||
GlobalValue::LinkageTypes OriginalLinkage = S->linkage();
|
||||
// Ignore local and appending linkage values since the linker
|
||||
// doesn't resolve them.
|
||||
@ -316,17 +317,29 @@ static void thinLTOResolvePrevailingGUID(
|
||||
// ensure a copy is kept to satisfy the exported reference.
|
||||
// FIXME: We may want to split the compile time and correctness
|
||||
// aspects into separate routines.
|
||||
if (isPrevailing(GUID, S.get())) {
|
||||
if (GlobalValue::isLinkOnceLinkage(OriginalLinkage))
|
||||
if (isPrevailing(VI.getGUID(), S.get())) {
|
||||
if (GlobalValue::isLinkOnceLinkage(OriginalLinkage)) {
|
||||
S->setLinkage(GlobalValue::getWeakLinkage(
|
||||
GlobalValue::isLinkOnceODRLinkage(OriginalLinkage)));
|
||||
// The kept copy is eligible for auto-hiding (hidden visibility) if all
|
||||
// copies were (i.e. they were all linkonce_odr global unnamed addr).
|
||||
// If any copy is not (e.g. it was originally weak_odr), then the symbol
|
||||
// must remain externally available (e.g. a weak_odr from an explicitly
|
||||
// instantiated template). Additionally, if it is in the
|
||||
// GUIDPreservedSymbols set, that means that it is visibile outside
|
||||
// the summary (e.g. in a native object or a bitcode file without
|
||||
// summary), and in that case we cannot hide it as it isn't possible to
|
||||
// check all copies.
|
||||
S->setCanAutoHide(VI.canAutoHide() &&
|
||||
!GUIDPreservedSymbols.count(VI.getGUID()));
|
||||
}
|
||||
}
|
||||
// Alias and aliasee can't be turned into available_externally.
|
||||
else if (!isa<AliasSummary>(S.get()) &&
|
||||
!GlobalInvolvedWithAlias.count(S.get()))
|
||||
S->setLinkage(GlobalValue::AvailableExternallyLinkage);
|
||||
if (S->linkage() != OriginalLinkage)
|
||||
recordNewLinkage(S->modulePath(), GUID, S->linkage());
|
||||
recordNewLinkage(S->modulePath(), VI.getGUID(), S->linkage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -341,7 +354,8 @@ void llvm::thinLTOResolvePrevailingInIndex(
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing,
|
||||
function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
|
||||
recordNewLinkage) {
|
||||
recordNewLinkage,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
|
||||
// We won't optimize the globals that are referenced by an alias for now
|
||||
// Ideally we should turn the alias into a global and duplicate the definition
|
||||
// when needed.
|
||||
@ -352,9 +366,9 @@ void llvm::thinLTOResolvePrevailingInIndex(
|
||||
GlobalInvolvedWithAlias.insert(&AS->getAliasee());
|
||||
|
||||
for (auto &I : Index)
|
||||
thinLTOResolvePrevailingGUID(I.second.SummaryList, I.first,
|
||||
GlobalInvolvedWithAlias, isPrevailing,
|
||||
recordNewLinkage);
|
||||
thinLTOResolvePrevailingGUID(Index.getValueInfo(I), GlobalInvolvedWithAlias,
|
||||
isPrevailing, recordNewLinkage,
|
||||
GUIDPreservedSymbols);
|
||||
}
|
||||
|
||||
static void thinLTOInternalizeAndPromoteGUID(
|
||||
@ -903,7 +917,7 @@ Error LTO::run(AddStreamFn AddStream, NativeObjectCache Cache) {
|
||||
|
||||
Error Result = runRegularLTO(AddStream);
|
||||
if (!Result)
|
||||
Result = runThinLTO(AddStream, Cache);
|
||||
Result = runThinLTO(AddStream, Cache, GUIDPreservedSymbols);
|
||||
|
||||
if (StatsFile)
|
||||
PrintStatisticsJSON(StatsFile->os());
|
||||
@ -1206,7 +1220,8 @@ ThinBackend lto::createWriteIndexesThinBackend(
|
||||
};
|
||||
}
|
||||
|
||||
Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache) {
|
||||
Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
|
||||
if (ThinLTO.ModuleMap.empty())
|
||||
return Error::success();
|
||||
|
||||
@ -1288,7 +1303,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache) {
|
||||
ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
|
||||
};
|
||||
thinLTOResolvePrevailingInIndex(ThinLTO.CombinedIndex, isPrevailing,
|
||||
recordNewLinkage);
|
||||
recordNewLinkage, GUIDPreservedSymbols);
|
||||
|
||||
std::unique_ptr<ThinBackendProc> BackendProc =
|
||||
ThinLTO.Backend(Conf, ThinLTO.CombinedIndex, ModuleToDefinedGVSummaries,
|
||||
|
@ -457,7 +457,8 @@ ProcessThinLTOModule(Module &TheModule, ModuleSummaryIndex &Index,
|
||||
static void resolvePrevailingInIndex(
|
||||
ModuleSummaryIndex &Index,
|
||||
StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>>
|
||||
&ResolvedODR) {
|
||||
&ResolvedODR,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
|
||||
|
||||
DenseMap<GlobalValue::GUID, const GlobalValueSummary *> PrevailingCopy;
|
||||
computePrevailingCopies(Index, PrevailingCopy);
|
||||
@ -476,7 +477,8 @@ static void resolvePrevailingInIndex(
|
||||
ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
|
||||
};
|
||||
|
||||
thinLTOResolvePrevailingInIndex(Index, isPrevailing, recordNewLinkage);
|
||||
thinLTOResolvePrevailingInIndex(Index, isPrevailing, recordNewLinkage,
|
||||
GUIDPreservedSymbols);
|
||||
}
|
||||
|
||||
// Initialize the TargetMachine builder for a given Triple
|
||||
@ -630,7 +632,7 @@ void ThinLTOCodeGenerator::promote(Module &TheModule, ModuleSummaryIndex &Index,
|
||||
|
||||
// Resolve prevailing symbols
|
||||
StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
|
||||
resolvePrevailingInIndex(Index, ResolvedODR);
|
||||
resolvePrevailingInIndex(Index, ResolvedODR, GUIDPreservedSymbols);
|
||||
|
||||
thinLTOResolvePrevailingInModule(
|
||||
TheModule, ModuleToDefinedGVSummaries[ModuleIdentifier]);
|
||||
@ -786,7 +788,7 @@ void ThinLTOCodeGenerator::internalize(Module &TheModule,
|
||||
|
||||
// Resolve prevailing symbols
|
||||
StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
|
||||
resolvePrevailingInIndex(Index, ResolvedODR);
|
||||
resolvePrevailingInIndex(Index, ResolvedODR, GUIDPreservedSymbols);
|
||||
|
||||
// Promote the exported values in the index, so that they are promoted
|
||||
// in the module.
|
||||
@ -945,7 +947,7 @@ void ThinLTOCodeGenerator::run() {
|
||||
|
||||
// Resolve prevailing symbols, this has to be computed early because it
|
||||
// impacts the caching.
|
||||
resolvePrevailingInIndex(*Index, ResolvedODR);
|
||||
resolvePrevailingInIndex(*Index, ResolvedODR, GUIDPreservedSymbols);
|
||||
|
||||
// Use global summary-based analysis to identify symbols that can be
|
||||
// internalized (because they aren't exported or preserved as per callback).
|
||||
|
@ -976,12 +976,15 @@ void llvm::thinLTOResolvePrevailingInModule(
|
||||
// changed to enable this for aliases.
|
||||
llvm_unreachable("Expected GV to be converted");
|
||||
} else {
|
||||
// If the original symbols has global unnamed addr and linkonce_odr linkage,
|
||||
// it should be an auto hide symbol. Add hidden visibility to the symbol to
|
||||
// preserve the property.
|
||||
if (GV.hasLinkOnceODRLinkage() && GV.hasGlobalUnnamedAddr() &&
|
||||
NewLinkage == GlobalValue::WeakODRLinkage)
|
||||
// If all copies of the original symbol had global unnamed addr and
|
||||
// linkonce_odr linkage, it should be an auto hide symbol. In that case
|
||||
// the thin link would have marked it as CanAutoHide. Add hidden visibility
|
||||
// to the symbol to preserve the property.
|
||||
if (NewLinkage == GlobalValue::WeakODRLinkage &&
|
||||
GS->second->canAutoHide()) {
|
||||
assert(GV.hasLinkOnceODRLinkage() && GV.hasGlobalUnnamedAddr());
|
||||
GV.setVisibility(GlobalValue::HiddenVisibility);
|
||||
}
|
||||
|
||||
LLVM_DEBUG(dbgs() << "ODR fixing up linkage for `" << GV.getName()
|
||||
<< "` from " << GV.getLinkage() << " to " << NewLinkage
|
||||
|
@ -22,7 +22,7 @@
|
||||
^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1), insts: 1)))
|
||||
^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0))))
|
||||
; Test appending globel variable with reference (tests backward reference on
|
||||
@ -67,28 +67,28 @@
|
||||
; Make sure we get back from llvm-dis essentially what we put in via llvm-as.
|
||||
; CHECK: ^0 = module: (path: "thinlto-summary1.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
; CHECK: ^1 = module: (path: "thinlto-summary2.o", hash: (2998369023, 4283347029, 1195487472, 2757298015, 1852134156))
|
||||
; CHECK: ^2 = gv: (guid: 1, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none)), refs: (^14, readonly ^13))))
|
||||
; CHECK: ^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 10, calls: ((callee: ^15)))))
|
||||
; CHECK: ^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 1)))
|
||||
; CHECK: ^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: ^14)))
|
||||
; CHECK: ^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; CHECK: ^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; CHECK: ^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; CHECK: ^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; CHECK: ^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; CHECK: ^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0))))
|
||||
; CHECK: ^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0), refs: (^4))))
|
||||
; CHECK: ^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 1))))
|
||||
; CHECK: ^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1), varFlags: (readonly: 0))))
|
||||
; CHECK: ^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 1, live: 1, dsoLocal: 0), insts: 1)))
|
||||
; CHECK: ^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1, funcFlags: (readNone: 1, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0))))
|
||||
; CHECK: ^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 1, noRecurse: 0, returnDoesNotAlias: 1, noInline: 0), calls: ((callee: ^15)))))
|
||||
; CHECK: ^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: ^14)))
|
||||
; CHECK: ^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 4, typeIdInfo: (typeTests: (^24, ^26)))))
|
||||
; CHECK: ^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^27, offset: 16))))))
|
||||
; CHECK: ^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^25, offset: 16))))))
|
||||
; CHECK: ^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (^27, offset: 16), args: (42)), (vFuncId: (^27, offset: 24)))))))
|
||||
; CHECK: ^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (^28, offset: 16), args: (42)))))))
|
||||
; CHECK: ^2 = gv: (guid: 1, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none)), refs: (^14, readonly ^13))))
|
||||
; CHECK: ^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 10, calls: ((callee: ^15)))))
|
||||
; CHECK: ^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), aliasee: ^14)))
|
||||
; CHECK: ^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1), insts: 1)))
|
||||
; CHECK: ^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0))))
|
||||
; CHECK: ^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0), refs: (^4))))
|
||||
; CHECK: ^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1))))
|
||||
; CHECK: ^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 0))))
|
||||
; CHECK: ^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 1, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1, funcFlags: (readNone: 1, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0))))
|
||||
; CHECK: ^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 1, noRecurse: 0, returnDoesNotAlias: 1, noInline: 0), calls: ((callee: ^15)))))
|
||||
; CHECK: ^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), aliasee: ^14)))
|
||||
; CHECK: ^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 4, typeIdInfo: (typeTests: (^24, ^26)))))
|
||||
; CHECK: ^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^27, offset: 16))))))
|
||||
; CHECK: ^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^25, offset: 16))))))
|
||||
; CHECK: ^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (^27, offset: 16), args: (42)), (vFuncId: (^27, offset: 24)))))))
|
||||
; CHECK: ^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (^28, offset: 16), args: (42)))))))
|
||||
; CHECK: ^24 = typeid: (name: "_ZTS1C", summary: (typeTestRes: (kind: single, sizeM1BitWidth: 0))) ; guid = 1884921850105019584
|
||||
; CHECK: ^25 = typeid: (name: "_ZTS1B", summary: (typeTestRes: (kind: inline, sizeM1BitWidth: 0, alignLog2: 1, sizeM1: 2, bitMask: 3, inlineBits: 4))) ; guid = 6203814149063363976
|
||||
; CHECK: ^26 = typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: allOnes, sizeM1BitWidth: 7), wpdResolutions: ((offset: 0, wpdRes: (kind: branchFunnel)), (offset: 8, wpdRes: (kind: singleImpl, singleImplName: "_ZN1A1nEi")), (offset: 16, wpdRes: (kind: indir, resByArg: (args: (1, 2), byArg: (kind: indir, byte: 2, bit: 3), args: (3), byArg: (kind: uniformRetVal, info: 1), args: (4), byArg: (kind: uniqueRetVal, info: 1), args: (5), byArg: (kind: virtualConstProp))))))) ; guid = 7004155349499253778
|
||||
|
@ -53,11 +53,11 @@ entry:
|
||||
declare void @analias(...)
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "analias", summaries: (alias: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), aliasee: ^2))) ; guid = 12695095382722328222
|
||||
; DIS: ^2 = gv: (name: "aliasee", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1))) ; guid = 17407585008595848568
|
||||
; DIS: ^1 = gv: (name: "analias", summaries: (alias: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), aliasee: ^2))) ; guid = 12695095382722328222
|
||||
; DIS: ^2 = gv: (name: "aliasee", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1))) ; guid = 17407585008595848568
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-alias.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = module: (path: "{{.*}}thinlto-alias.ll.tmp2.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 12695095382722328222, summaries: (alias: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), aliasee: ^4)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 15822663052811949562, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, calls: ((callee: ^2)))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 17407585008595848568, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 12695095382722328222, summaries: (alias: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), aliasee: ^4)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 15822663052811949562, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, calls: ((callee: ^2)))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 17407585008595848568, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
|
@ -150,16 +150,16 @@ declare void @none3() #1
|
||||
; DIS: ^6 = gv: (name: "cold") ; guid = 11668175513417606517
|
||||
; DIS: ^7 = gv: (name: "hot4") ; guid = 13161834114071272798
|
||||
; DIS: ^8 = gv: (name: "none3") ; guid = 16213681105727317812
|
||||
; DIS: ^9 = gv: (name: "hot_function", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^7, hotness: cold), (callee: ^10, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^8, hotness: none), (callee: ^1, hotness: critical))))) ; guid = 17381606045411660303
|
||||
; DIS: ^9 = gv: (name: "hot_function", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^7, hotness: cold), (callee: ^10, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^8, hotness: none), (callee: ^1, hotness: critical))))) ; guid = 17381606045411660303
|
||||
; DIS: ^10 = gv: (name: "none1") ; guid = 17712061229457633252
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-function-summary-callgraph-profile-summary.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = module: (path: "{{.*}}thinlto-function-summary-callgraph-profile-summary.ll.tmp2.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 3741006263754194003, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 5026609803865204483, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 8117347573235780485, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 9453975128311291976, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11668175513417606517, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^7 = gv: (guid: 16213681105727317812, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^8 = gv: (guid: 17381606045411660303, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^9, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^7, hotness: none)))))
|
||||
; COMBINED-DIS: ^9 = gv: (guid: 17712061229457633252, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 3741006263754194003, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 5026609803865204483, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 8117347573235780485, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 9453975128311291976, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11668175513417606517, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^7 = gv: (guid: 16213681105727317812, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^8 = gv: (guid: 17381606045411660303, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^9, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^7, hotness: none)))))
|
||||
; COMBINED-DIS: ^9 = gv: (guid: 17712061229457633252, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
|
@ -39,5 +39,5 @@ declare void @func(...) #1
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "func") ; guid = 7289175272376759421
|
||||
; DIS: ^2 = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 3, calls: ((callee: ^1, relbf: 256)), refs: (readonly ^3)))) ; guid = 15822663052811949562
|
||||
; DIS: ^2 = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 3, calls: ((callee: ^1, relbf: 256)), refs: (readonly ^3)))) ; guid = 15822663052811949562
|
||||
; DIS: ^3 = gv: (name: "undefinedglob") ; guid = 18036901804029949403
|
||||
|
@ -148,17 +148,17 @@ entry:
|
||||
; order, which depends on GUID, and the private function Y GUID will depend
|
||||
; on the path to the test.
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS-DAG: = gv: (name: "Z", summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, calls: ((callee: ^{{.*}}))))) ; guid = 104084381700047393
|
||||
; DIS-DAG: = gv: (name: "X", summaries: (function: (module: ^0, flags: (linkage: available_externally, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 1881667236089500162
|
||||
; DIS-DAG: = gv: (name: "W", summaries: (function: (module: ^0, flags: (linkage: weak_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 5790125716599269729
|
||||
; DIS-DAG: = gv: (name: "Z", summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, calls: ((callee: ^{{.*}}))))) ; guid = 104084381700047393
|
||||
; DIS-DAG: = gv: (name: "X", summaries: (function: (module: ^0, flags: (linkage: available_externally, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 1881667236089500162
|
||||
; DIS-DAG: = gv: (name: "W", summaries: (function: (module: ^0, flags: (linkage: weak_odr, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 5790125716599269729
|
||||
; DIS-DAG: = gv: (name: "foo") ; guid = 6699318081062747564
|
||||
; DIS-DAG: = gv: (name: "func") ; guid = 7289175272376759421
|
||||
; DIS-DAG: = gv: (name: "func3") ; guid = 11517462787082255043
|
||||
; DIS-DAG: = gv: (name: "globalvar", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 1)))) ; guid = 12887606300320728018
|
||||
; DIS-DAG: = gv: (name: "globalvar", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1)))) ; guid = 12887606300320728018
|
||||
; DIS-DAG: = gv: (name: "func2") ; guid = 14069196320850861797
|
||||
; DIS-DAG: = gv: (name: "llvm.ctpop.i8") ; guid = 15254915475081819833
|
||||
; DIS-DAG: = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 9, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 15822663052811949562
|
||||
; DIS-DAG: = gv: (name: "bar", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 1), refs: (^{{.*}})))) ; guid = 16434608426314478903
|
||||
; DIS-DAG: = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 9, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 15822663052811949562
|
||||
; DIS-DAG: = gv: (name: "bar", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1), refs: (^{{.*}})))) ; guid = 16434608426314478903
|
||||
; Don't try to match the exact GUID. Since it is private, the file path
|
||||
; will get hashed, and that will be test dependent.
|
||||
; DIS-DAG: = gv: (name: "Y", summaries: (function: (module: ^0, flags: (linkage: private, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 14, calls: ((callee: ^{{.*}}))))) ; guid =
|
||||
; DIS-DAG: = gv: (name: "Y", summaries: (function: (module: ^0, flags: (linkage: private, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 14, calls: ((callee: ^{{.*}}))))) ; guid =
|
||||
|
@ -37,11 +37,11 @@ declare i1 @llvm.type.test(i8*, metadata) nounwind readnone
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "llvm.type.test") ; guid = 608142985856744218
|
||||
; DIS: ^2 = gv: (name: "h", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, typeIdInfo: (typeTests: (16434608426314478903))))) ; guid = 8124147457056772133
|
||||
; DIS: ^3 = gv: (name: "g", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903))))) ; guid = 13146401226427987378
|
||||
; DIS: ^4 = gv: (name: "f", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, typeIdInfo: (typeTests: (6699318081062747564))))) ; guid = 14740650423002898831
|
||||
; DIS: ^2 = gv: (name: "h", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (16434608426314478903))))) ; guid = 8124147457056772133
|
||||
; DIS: ^3 = gv: (name: "g", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903))))) ; guid = 13146401226427987378
|
||||
; DIS: ^4 = gv: (name: "f", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (6699318081062747564))))) ; guid = 14740650423002898831
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-type-tests.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 8124147457056772133, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, typeIdInfo: (typeTests: (16434608426314478903)))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903)))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, typeIdInfo: (typeTests: (6699318081062747564)))))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 8124147457056772133, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (16434608426314478903)))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903)))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (6699318081062747564)))))
|
||||
|
@ -112,19 +112,19 @@ declare {i8*, i1} @llvm.type.checked.load(i8*, i32, metadata)
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "llvm.type.test") ; guid = 608142985856744218
|
||||
; DIS: ^2 = gv: (name: "f1", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 2072045998141807037
|
||||
; DIS: ^3 = gv: (name: "f3", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 4197650231481825559
|
||||
; DIS: ^2 = gv: (name: "f1", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 2072045998141807037
|
||||
; DIS: ^3 = gv: (name: "f3", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 4197650231481825559
|
||||
; DIS: ^4 = gv: (name: "llvm.type.checked.load") ; guid = 5568222536364573403
|
||||
; DIS: ^5 = gv: (name: "llvm.assume") ; guid = 6385187066495850096
|
||||
; DIS: ^6 = gv: (name: "f2", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32)))))) ; guid = 8471399308421654326
|
||||
; DIS: ^7 = gv: (name: "f4", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43))))))) ; guid = 10064745020953272174
|
||||
; DIS: ^8 = gv: (name: "f5", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42))))))) ; guid = 11686717102184386164
|
||||
; DIS: ^9 = gv: (name: "f6", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323))))) ; guid = 11834966808443348068
|
||||
; DIS: ^6 = gv: (name: "f2", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 15, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32)))))) ; guid = 8471399308421654326
|
||||
; DIS: ^7 = gv: (name: "f4", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43))))))) ; guid = 10064745020953272174
|
||||
; DIS: ^8 = gv: (name: "f5", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42))))))) ; guid = 11686717102184386164
|
||||
; DIS: ^9 = gv: (name: "f6", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323))))) ; guid = 11834966808443348068
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-type-vcalls.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 2072045998141807037, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 4197650231481825559, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 8471399308421654326, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32))))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 10064745020953272174, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43)))))))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 11686717102184386164, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)))))))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11834966808443348068, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323)))))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 2072045998141807037, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 4197650231481825559, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 8471399308421654326, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 15, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32))))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 10064745020953272174, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43)))))))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 11686717102184386164, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)))))))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11834966808443348068, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323)))))
|
||||
|
5
test/ThinLTO/X86/Inputs/linkonce_odr_unnamed_addr.ll
Normal file
5
test/ThinLTO/X86/Inputs/linkonce_odr_unnamed_addr.ll
Normal file
@ -0,0 +1,5 @@
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-grtev4-linux-gnu"
|
||||
|
||||
@linkonceodrunnamed = linkonce_odr unnamed_addr constant i32 0
|
||||
@odrunnamed = weak_odr unnamed_addr constant i32 0
|
@ -1,12 +1,31 @@
|
||||
; This test ensures that when linkonce_odr + unnamed_addr symbols promoted to
|
||||
; weak symbols, it preserves the auto hide property.
|
||||
; weak symbols, it preserves the auto hide property when possible.
|
||||
|
||||
; RUN: opt -module-summary %s -o %t.bc
|
||||
; RUN: opt -module-summary %s -o %t2.bc
|
||||
; RUN: opt -module-summary %p/Inputs/linkonce_odr_unnamed_addr.ll -o %t2.bc
|
||||
; Check old LTO API
|
||||
; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t.bc %t2.bc
|
||||
; RUN: llvm-lto -thinlto-action=promote %t.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s
|
||||
; Check new LTO API
|
||||
; RUN: llvm-lto2 run -save-temps -o %t6.bc %t.bc %t2.bc -r=%t.bc,linkonceodrunnamed,p -r=%t.bc,odrunnamed,p -r=%t2.bc,linkonceodrunnamed, -r=%t2.bc,odrunnamed,
|
||||
; RUN: llvm-dis %t6.bc.1.1.promote.bc -o - | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
; Now test when one module does not have a summary. In that case we must be
|
||||
; conservative and not auto hide.
|
||||
; RUN: opt %p/Inputs/linkonce_odr_unnamed_addr.ll -o %t4.bc
|
||||
; Check new LTO API (old LTO API does not detect this case).
|
||||
; RUN: llvm-lto2 run -save-temps -o %t6.bc %t.bc %t4.bc -r=%t.bc,linkonceodrunnamed,p -r=%t.bc,odrunnamed,p -r=%t4.bc,linkonceodrunnamed, -r=%t4.bc,odrunnamed,
|
||||
; RUN: llvm-dis %t6.bc.1.1.promote.bc -o - | FileCheck %s --check-prefix=NOSUMMARY
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-grtev4-linux-gnu"
|
||||
|
||||
; In this case all copies are linkonce_odr, so it may be hidden.
|
||||
; CHECK: @linkonceodrunnamed = weak_odr hidden unnamed_addr constant i32 0
|
||||
; NOSUMMARY: @linkonceodrunnamed = weak_odr unnamed_addr constant i32 0
|
||||
@linkonceodrunnamed = linkonce_odr unnamed_addr constant i32 0
|
||||
|
||||
; In this case, the other copy was weak_odr, so it may not be hidden.
|
||||
; CHECK: @odrunnamed = weak_odr unnamed_addr constant i32 0
|
||||
; NOSUMMARY: @odrunnamed = weak_odr unnamed_addr constant i32 0
|
||||
@odrunnamed = linkonce_odr unnamed_addr constant i32 0
|
||||
|
@ -10,7 +10,7 @@
|
||||
; Copy from first module is prevailing and converted to weak_odr, copy
|
||||
; from second module is preempted and converted to available_externally and
|
||||
; removed from comdat.
|
||||
; IMPORT1: define weak_odr hidden i32 @f(i8*) unnamed_addr comdat($c1) {
|
||||
; IMPORT1: define weak_odr i32 @f(i8*) unnamed_addr comdat($c1) {
|
||||
; IMPORT2: define available_externally i32 @f(i8*) unnamed_addr {
|
||||
|
||||
; RUN: llvm-nm -o - < %t1.bc.thinlto.o | FileCheck %s --check-prefix=NM1
|
||||
|
@ -8,6 +8,7 @@
|
||||
; SUMMARY-NEXT: NotEligibleToImport: false
|
||||
; SUMMARY-NEXT: Live: true
|
||||
; SUMMARY-NEXT: Local: false
|
||||
; SUMMARY-NEXT: CanAutoHide: false
|
||||
; SUMMARY-NEXT: TypeTests: [ 123 ]
|
||||
; SUMMARY-NEXT: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid1:
|
||||
|
@ -8,6 +8,7 @@
|
||||
; SUMMARY-NEXT: NotEligibleToImport: false
|
||||
; SUMMARY-NEXT: Live: true
|
||||
; SUMMARY-NEXT: Local: false
|
||||
; SUMMARY-NEXT: CanAutoHide: false
|
||||
; SUMMARY-NEXT: TypeTestAssumeVCalls:
|
||||
; SUMMARY-NEXT: - GUID: 123
|
||||
; SUMMARY-NEXT: Offset: 0
|
||||
|
5
test/tools/gold/X86/Inputs/linkonce_odr_unnamed_addr.ll
Normal file
5
test/tools/gold/X86/Inputs/linkonce_odr_unnamed_addr.ll
Normal file
@ -0,0 +1,5 @@
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-grtev4-linux-gnu"
|
||||
|
||||
@linkonceodrunnamed = linkonce_odr unnamed_addr constant i32 0
|
||||
@odrunnamed = weak_odr unnamed_addr constant i32 0
|
30
test/tools/gold/X86/linkonce_odr_unnamed_addr.ll
Normal file
30
test/tools/gold/X86/linkonce_odr_unnamed_addr.ll
Normal file
@ -0,0 +1,30 @@
|
||||
; This test ensures that when linkonce_odr + unnamed_addr symbols promoted to
|
||||
; weak symbols, it preserves the auto hide property when possible.
|
||||
|
||||
; RUN: opt -module-summary %s -o %t.o
|
||||
; RUN: opt -module-summary %p/Inputs/linkonce_odr_unnamed_addr.ll -o %t2.o
|
||||
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
||||
; RUN: --plugin-opt=save-temps \
|
||||
; RUN: %t.o %t2.o -o %t3.o
|
||||
; RUN: llvm-dis %t.o.1.promote.bc -o - | FileCheck %s
|
||||
|
||||
; Now test when one module is a native object. In that case we must be
|
||||
; conservative and not auto hide.
|
||||
; RUN: llc %p/Inputs/linkonce_odr_unnamed_addr.ll -o %t2native.o -filetype=obj
|
||||
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
||||
; RUN: --plugin-opt=save-temps \
|
||||
; RUN: %t.o %t2native.o -o %t3.o
|
||||
; RUN: llvm-dis %t.o.1.promote.bc -o - | FileCheck %s --check-prefix=NOSUMMARY
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-grtev4-linux-gnu"
|
||||
|
||||
; In this case all copies are linkonce_odr, so it may be hidden.
|
||||
; CHECK: @linkonceodrunnamed = weak_odr hidden unnamed_addr constant i32 0
|
||||
; NOSUMMARY: @linkonceodrunnamed = weak_odr dso_local unnamed_addr constant i32 0
|
||||
@linkonceodrunnamed = linkonce_odr unnamed_addr constant i32 0
|
||||
|
||||
; In this case, the other copy was weak_odr, so it may not be hidden.
|
||||
; CHECK: @odrunnamed = weak_odr dso_local unnamed_addr constant i32 0
|
||||
; NOSUMMARY: @odrunnamed = weak_odr dso_local unnamed_addr constant i32 0
|
||||
@odrunnamed = linkonce_odr unnamed_addr constant i32 0
|
@ -119,11 +119,11 @@
|
||||
|
||||
; DIS1: ^0 = module: (path: "{{.*}}thinlto.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; DIS1: ^1 = module: (path: "{{.*}}thinlto.ll.tmp2.o", hash: (0, 0, 0, 0, 0))
|
||||
; DIS1: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 0), insts: 1)))
|
||||
; DIS1: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 0), insts: 2, calls: ((callee: ^2)))))
|
||||
; DIS1: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; DIS1: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 2, calls: ((callee: ^2)))))
|
||||
|
||||
; DIS2: ^0 = module: (path: "{{.*}}thinlto.ll.tmp2.o", hash: (0, 0, 0, 0, 0))
|
||||
; DIS2: ^1 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 0), insts: 1)))
|
||||
; DIS2: ^1 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
|
||||
; COMBINED: <MODULE_STRTAB_BLOCK
|
||||
; COMBINED-NEXT: <ENTRY {{.*}} record string = '{{.*}}/test/tools/gold/X86/Output/thinlto.ll.tmp{{.*}}.o'
|
||||
|
Loading…
x
Reference in New Issue
Block a user