mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-02 18:58:15 +00:00
[ThinLTO] Add Visibility bits to GlobalValueSummary::GVFlags
Imported functions and variable get the visibility from the module supplying the definition. However, non-imported definitions do not get the visibility from (ELF) the most constraining visibility among all modules (Mach-O) the visibility of the prevailing definition. This patch * adds visibility bits to GlobalValueSummary::GVFlags * computes the result visibility and propagates it to all definitions Protected/hidden can imply dso_local which can enable some optimizations (this is stronger than GVFlags::DSOLocal because the implied dso_local can be leveraged for ELF -shared while default visibility dso_local has to be cleared for ELF -shared). Note: we don't have summaries for declarations, so for ELF if a declaration has the most constraining visibility, the result visibility may not be that one. Differential Revision: https://reviews.llvm.org/D92900
This commit is contained in:
parent
0b50fa9945
commit
54fb3ca96e
@ -223,6 +223,11 @@ struct ValueInfo {
|
||||
return RefAndFlags.getPointer();
|
||||
}
|
||||
|
||||
/// Returns the most constraining visibility among summaries. The
|
||||
/// visibilities, ordered from least to most constraining, are: default,
|
||||
/// protected and hidden.
|
||||
GlobalValue::VisibilityTypes getELFVisibility() const;
|
||||
|
||||
bool isDSOLocal() const;
|
||||
|
||||
/// Checks if all copies are eligible for auto-hiding (have flag set).
|
||||
@ -294,6 +299,9 @@ public:
|
||||
/// types based on global summary-based analysis.
|
||||
unsigned Linkage : 4;
|
||||
|
||||
/// Indicates the visibility.
|
||||
unsigned Visibility : 2;
|
||||
|
||||
/// Indicate if the global value cannot be imported (e.g. it cannot
|
||||
/// be renamed or references something that can't be renamed).
|
||||
unsigned NotEligibleToImport : 1;
|
||||
@ -322,10 +330,12 @@ public:
|
||||
|
||||
/// Convenience Constructors
|
||||
explicit GVFlags(GlobalValue::LinkageTypes Linkage,
|
||||
GlobalValue::VisibilityTypes Visibility,
|
||||
bool NotEligibleToImport, bool Live, bool IsLocal,
|
||||
bool CanAutoHide)
|
||||
: Linkage(Linkage), NotEligibleToImport(NotEligibleToImport),
|
||||
Live(Live), DSOLocal(IsLocal), CanAutoHide(CanAutoHide) {}
|
||||
: Linkage(Linkage), Visibility(Visibility),
|
||||
NotEligibleToImport(NotEligibleToImport), Live(Live),
|
||||
DSOLocal(IsLocal), CanAutoHide(CanAutoHide) {}
|
||||
};
|
||||
|
||||
private:
|
||||
@ -410,6 +420,13 @@ public:
|
||||
|
||||
bool canAutoHide() const { return Flags.CanAutoHide; }
|
||||
|
||||
GlobalValue::VisibilityTypes getVisibility() const {
|
||||
return (GlobalValue::VisibilityTypes)Flags.Visibility;
|
||||
}
|
||||
void setVisibility(GlobalValue::VisibilityTypes Vis) {
|
||||
Flags.Visibility = (unsigned)Vis;
|
||||
}
|
||||
|
||||
/// Flag that this global value cannot be imported.
|
||||
void setNotEligibleToImport() { Flags.NotEligibleToImport = true; }
|
||||
|
||||
@ -594,6 +611,7 @@ public:
|
||||
return FunctionSummary(
|
||||
FunctionSummary::GVFlags(
|
||||
GlobalValue::LinkageTypes::AvailableExternallyLinkage,
|
||||
GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false,
|
||||
/*CanAutoHide=*/false),
|
||||
/*NumInsts=*/0, FunctionSummary::FFlags{}, /*EntryCount=*/0,
|
||||
|
@ -136,7 +136,7 @@ template <> struct MappingTraits<TypeIdSummary> {
|
||||
};
|
||||
|
||||
struct FunctionSummaryYaml {
|
||||
unsigned Linkage;
|
||||
unsigned Linkage, Visibility;
|
||||
bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
|
||||
std::vector<uint64_t> Refs;
|
||||
std::vector<uint64_t> TypeTests;
|
||||
@ -178,6 +178,7 @@ namespace yaml {
|
||||
template <> struct MappingTraits<FunctionSummaryYaml> {
|
||||
static void mapping(IO &io, FunctionSummaryYaml& summary) {
|
||||
io.mapOptional("Linkage", summary.Linkage);
|
||||
io.mapOptional("Visibility", summary.Visibility);
|
||||
io.mapOptional("NotEligibleToImport", summary.NotEligibleToImport);
|
||||
io.mapOptional("Live", summary.Live);
|
||||
io.mapOptional("Local", summary.IsLocal);
|
||||
@ -224,6 +225,7 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
Elem.SummaryList.push_back(std::make_unique<FunctionSummary>(
|
||||
GlobalValueSummary::GVFlags(
|
||||
static_cast<GlobalValue::LinkageTypes>(FSum.Linkage),
|
||||
static_cast<GlobalValue::VisibilityTypes>(FSum.Visibility),
|
||||
FSum.NotEligibleToImport, FSum.Live, FSum.IsLocal,
|
||||
FSum.CanAutoHide),
|
||||
/*NumInsts=*/0, FunctionSummary::FFlags{}, /*EntryCount=*/0, Refs,
|
||||
@ -244,7 +246,7 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
for (auto &VI : FSum->refs())
|
||||
Refs.push_back(VI.getGUID());
|
||||
FSums.push_back(FunctionSummaryYaml{
|
||||
FSum->flags().Linkage,
|
||||
FSum->flags().Linkage, FSum->flags().Visibility,
|
||||
static_cast<bool>(FSum->flags().NotEligibleToImport),
|
||||
static_cast<bool>(FSum->flags().Live),
|
||||
static_cast<bool>(FSum->flags().DSOLocal),
|
||||
|
@ -38,6 +38,10 @@ namespace lto {
|
||||
/// LTO configuration. A linker can configure LTO by setting fields in this data
|
||||
/// structure and passing it to the lto::LTO constructor.
|
||||
struct Config {
|
||||
enum VisScheme {
|
||||
FromPrevailing,
|
||||
ELF,
|
||||
};
|
||||
// Note: when adding fields here, consider whether they need to be added to
|
||||
// computeCacheKey in LTO.cpp.
|
||||
std::string CPU;
|
||||
@ -75,6 +79,12 @@ struct Config {
|
||||
/// want to know a priori all possible output files.
|
||||
bool AlwaysEmitRegularLTOObj = false;
|
||||
|
||||
/// Allows non-imported definitions to get the potentially more constraining
|
||||
/// visibility from the prevailing definition. FromPrevailing is the default
|
||||
/// because it works for many binary formats. ELF can use the more optimized
|
||||
/// 'ELF' scheme.
|
||||
VisScheme VisibilityScheme = FromPrevailing;
|
||||
|
||||
/// If this field is set, the set of passes run in the middle-end optimizer
|
||||
/// will be the one specified by the string. Only works with the new pass
|
||||
/// manager as the old one doesn't have this ability.
|
||||
|
@ -43,7 +43,7 @@ class ToolOutputFile;
|
||||
/// This is done for correctness (if value exported, ensure we always
|
||||
/// emit a copy), and compile-time optimization (allow drop of duplicates).
|
||||
void thinLTOResolvePrevailingInIndex(
|
||||
ModuleSummaryIndex &Index,
|
||||
const lto::Config &C, ModuleSummaryIndex &Index,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing,
|
||||
function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
|
||||
|
@ -214,8 +214,10 @@ std::error_code EmitImportsFiles(
|
||||
StringRef ModulePath, StringRef OutputFilename,
|
||||
const std::map<std::string, GVSummaryMapTy> &ModuleToSummariesForIndex);
|
||||
|
||||
/// Resolve prevailing symbol linkages in \p TheModule based on the information
|
||||
/// recorded in the summaries during global summary-based analysis.
|
||||
/// Resolve prevailing symbol linkages and constrain visibility (1. CanAutoHide,
|
||||
/// 2. consider visibility from other definitions for ELF) in \p TheModule based
|
||||
/// on the information recorded in the summaries during global summary-based
|
||||
/// analysis.
|
||||
void thinLTOResolvePrevailingInModule(Module &TheModule,
|
||||
const GVSummaryMapTy &DefinedGlobals);
|
||||
|
||||
|
@ -459,9 +459,10 @@ static void computeFunctionSummary(
|
||||
bool NonRenamableLocal = isNonRenamableLocal(F);
|
||||
bool NotEligibleForImport =
|
||||
NonRenamableLocal || HasInlineAsmMaybeReferencingInternal;
|
||||
GlobalValueSummary::GVFlags Flags(F.getLinkage(), NotEligibleForImport,
|
||||
/* Live = */ false, F.isDSOLocal(),
|
||||
F.hasLinkOnceODRLinkage() && F.hasGlobalUnnamedAddr());
|
||||
GlobalValueSummary::GVFlags Flags(
|
||||
F.getLinkage(), F.getVisibility(), NotEligibleForImport,
|
||||
/* Live = */ false, F.isDSOLocal(),
|
||||
F.hasLinkOnceODRLinkage() && F.hasGlobalUnnamedAddr());
|
||||
FunctionSummary::FFlags FunFlags{
|
||||
F.hasFnAttribute(Attribute::ReadNone),
|
||||
F.hasFnAttribute(Attribute::ReadOnly),
|
||||
@ -580,9 +581,10 @@ static void computeVariableSummary(ModuleSummaryIndex &Index,
|
||||
SmallPtrSet<const User *, 8> Visited;
|
||||
bool HasBlockAddress = findRefEdges(Index, &V, RefEdges, Visited);
|
||||
bool NonRenamableLocal = isNonRenamableLocal(V);
|
||||
GlobalValueSummary::GVFlags Flags(V.getLinkage(), NonRenamableLocal,
|
||||
/* Live = */ false, V.isDSOLocal(),
|
||||
V.hasLinkOnceODRLinkage() && V.hasGlobalUnnamedAddr());
|
||||
GlobalValueSummary::GVFlags Flags(
|
||||
V.getLinkage(), V.getVisibility(), NonRenamableLocal,
|
||||
/* Live = */ false, V.isDSOLocal(),
|
||||
V.hasLinkOnceODRLinkage() && V.hasGlobalUnnamedAddr());
|
||||
|
||||
VTableFuncList VTableFuncs;
|
||||
// If splitting is not enabled, then we compute the summary information
|
||||
@ -622,9 +624,10 @@ static void
|
||||
computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A,
|
||||
DenseSet<GlobalValue::GUID> &CantBePromoted) {
|
||||
bool NonRenamableLocal = isNonRenamableLocal(A);
|
||||
GlobalValueSummary::GVFlags Flags(A.getLinkage(), NonRenamableLocal,
|
||||
/* Live = */ false, A.isDSOLocal(),
|
||||
A.hasLinkOnceODRLinkage() && A.hasGlobalUnnamedAddr());
|
||||
GlobalValueSummary::GVFlags Flags(
|
||||
A.getLinkage(), A.getVisibility(), NonRenamableLocal,
|
||||
/* Live = */ false, A.isDSOLocal(),
|
||||
A.hasLinkOnceODRLinkage() && A.hasGlobalUnnamedAddr());
|
||||
auto AS = std::make_unique<AliasSummary>(Flags);
|
||||
auto *Aliasee = A.getBaseObject();
|
||||
auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
|
||||
@ -697,11 +700,12 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
|
||||
if (!GV)
|
||||
return;
|
||||
assert(GV->isDeclaration() && "Def in module asm already has definition");
|
||||
GlobalValueSummary::GVFlags GVFlags(GlobalValue::InternalLinkage,
|
||||
/* NotEligibleToImport = */ true,
|
||||
/* Live = */ true,
|
||||
/* Local */ GV->isDSOLocal(),
|
||||
GV->hasLinkOnceODRLinkage() && GV->hasGlobalUnnamedAddr());
|
||||
GlobalValueSummary::GVFlags GVFlags(
|
||||
GlobalValue::InternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/* NotEligibleToImport = */ true,
|
||||
/* Live = */ true,
|
||||
/* Local */ GV->isDSOLocal(),
|
||||
GV->hasLinkOnceODRLinkage() && GV->hasGlobalUnnamedAddr());
|
||||
CantBePromoted.insert(GV->getGUID());
|
||||
// Create the appropriate summary type.
|
||||
if (Function *F = dyn_cast<Function>(GV)) {
|
||||
|
@ -751,6 +751,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
KEYWORD(flags);
|
||||
KEYWORD(blockcount);
|
||||
KEYWORD(linkage);
|
||||
KEYWORD(visibility);
|
||||
KEYWORD(notEligibleToImport);
|
||||
KEYWORD(live);
|
||||
KEYWORD(dsoLocal);
|
||||
|
@ -8517,7 +8517,8 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
|
||||
StringRef ModulePath;
|
||||
GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage, /*NotEligibleToImport=*/false,
|
||||
GlobalValue::ExternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false);
|
||||
unsigned InstCount;
|
||||
std::vector<FunctionSummary::EdgeTy> Calls;
|
||||
@ -8593,7 +8594,8 @@ bool LLParser::parseVariableSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
|
||||
StringRef ModulePath;
|
||||
GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage, /*NotEligibleToImport=*/false,
|
||||
GlobalValue::ExternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false);
|
||||
GlobalVarSummary::GVarFlags GVarFlags(/*ReadOnly*/ false,
|
||||
/* WriteOnly */ false,
|
||||
@ -8651,7 +8653,8 @@ bool LLParser::parseAliasSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
|
||||
StringRef ModulePath;
|
||||
GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
|
||||
/*Linkage=*/GlobalValue::ExternalLinkage, /*NotEligibleToImport=*/false,
|
||||
GlobalValue::ExternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false);
|
||||
if (parseToken(lltok::colon, "expected ':' here") ||
|
||||
parseToken(lltok::lparen, "expected '(' here") ||
|
||||
@ -9339,8 +9342,9 @@ bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
|
||||
|
||||
/// GVFlags
|
||||
/// ::= 'flags' ':' '(' 'linkage' ':' OptionalLinkageAux ','
|
||||
/// 'notEligibleToImport' ':' Flag ',' 'live' ':' Flag ','
|
||||
/// 'dsoLocal' ':' Flag ',' 'canAutoHide' ':' Flag ')'
|
||||
/// 'visibility' ':' Flag 'notEligibleToImport' ':' Flag ','
|
||||
/// 'live' ':' Flag ',' 'dsoLocal' ':' Flag ','
|
||||
/// 'canAutoHide' ':' Flag ',' ')'
|
||||
bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
|
||||
assert(Lex.getKind() == lltok::kw_flags);
|
||||
Lex.Lex();
|
||||
@ -9361,6 +9365,13 @@ bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
|
||||
assert(HasLinkage && "Linkage not optional in summary entry");
|
||||
Lex.Lex();
|
||||
break;
|
||||
case lltok::kw_visibility:
|
||||
Lex.Lex();
|
||||
if (parseToken(lltok::colon, "expected ':'"))
|
||||
return true;
|
||||
parseOptionalVisibility(Flag);
|
||||
GVFlags.Visibility = Flag;
|
||||
break;
|
||||
case lltok::kw_notEligibleToImport:
|
||||
Lex.Lex();
|
||||
if (parseToken(lltok::colon, "expected ':'") || parseFlag(Flag))
|
||||
|
@ -384,6 +384,7 @@ enum Kind {
|
||||
kw_flags,
|
||||
kw_blockcount,
|
||||
kw_linkage,
|
||||
kw_visibility,
|
||||
kw_notEligibleToImport,
|
||||
kw_live,
|
||||
kw_dsoLocal,
|
||||
|
@ -968,13 +968,17 @@ static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags) {
|
||||
return Flags;
|
||||
}
|
||||
|
||||
/// Decode the flags for GlobalValue in the summary.
|
||||
// Decode the flags for GlobalValue in the summary. The bits for each attribute:
|
||||
//
|
||||
// linkage: [0,4), notEligibleToImport: 4, live: 5, local: 6, canAutoHide: 7,
|
||||
// visibility: [8, 10).
|
||||
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags,
|
||||
uint64_t Version) {
|
||||
// Summary were not emitted before LLVM 3.9, we don't need to upgrade Linkage
|
||||
// like getDecodedLinkage() above. Any future change to the linkage enum and
|
||||
// to getDecodedLinkage() will need to be taken into account here as above.
|
||||
auto Linkage = GlobalValue::LinkageTypes(RawFlags & 0xF); // 4 bits
|
||||
auto Visibility = GlobalValue::VisibilityTypes((RawFlags >> 8) & 3); // 2 bits
|
||||
RawFlags = RawFlags >> 4;
|
||||
bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
|
||||
// The Live flag wasn't introduced until version 3. For dead stripping
|
||||
@ -984,7 +988,8 @@ static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags,
|
||||
bool Local = (RawFlags & 0x4);
|
||||
bool AutoHide = (RawFlags & 0x8);
|
||||
|
||||
return GlobalValueSummary::GVFlags(Linkage, NotEligibleToImport, Live, Local, AutoHide);
|
||||
return GlobalValueSummary::GVFlags(Linkage, Visibility, NotEligibleToImport,
|
||||
Live, Local, AutoHide);
|
||||
}
|
||||
|
||||
// Decode the flags for GlobalVariable in the summary
|
||||
|
@ -1044,7 +1044,8 @@ static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags) {
|
||||
return RawFlags;
|
||||
}
|
||||
|
||||
// Decode the flags for GlobalValue in the summary
|
||||
// Decode the flags for GlobalValue in the summary. See getDecodedGVSummaryFlags
|
||||
// in BitcodeReader.cpp.
|
||||
static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) {
|
||||
uint64_t RawFlags = 0;
|
||||
|
||||
@ -1058,6 +1059,8 @@ static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) {
|
||||
// account here as well.
|
||||
RawFlags = (RawFlags << 4) | Flags.Linkage; // 4 bits
|
||||
|
||||
RawFlags |= (Flags.Visibility << 8); // 2 bits
|
||||
|
||||
return RawFlags;
|
||||
}
|
||||
|
||||
|
@ -3163,6 +3163,17 @@ static std::string getLinkageNameWithSpace(GlobalValue::LinkageTypes LT) {
|
||||
return getLinkageName(LT) + " ";
|
||||
}
|
||||
|
||||
static const char *getVisibilityName(GlobalValue::VisibilityTypes Vis) {
|
||||
switch (Vis) {
|
||||
case GlobalValue::DefaultVisibility:
|
||||
return "default";
|
||||
case GlobalValue::HiddenVisibility:
|
||||
return "hidden";
|
||||
case GlobalValue::ProtectedVisibility:
|
||||
return "protected";
|
||||
}
|
||||
}
|
||||
|
||||
void AssemblyWriter::printFunctionSummary(const FunctionSummary *FS) {
|
||||
Out << ", insts: " << FS->instCount();
|
||||
|
||||
@ -3331,6 +3342,8 @@ void AssemblyWriter::printSummary(const GlobalValueSummary &Summary) {
|
||||
Out << "(module: ^" << Machine.getModulePathSlot(Summary.modulePath())
|
||||
<< ", flags: (";
|
||||
Out << "linkage: " << getLinkageName(LT);
|
||||
Out << ", visibility: "
|
||||
<< getVisibilityName((GlobalValue::VisibilityTypes)GVFlags.Visibility);
|
||||
Out << ", notEligibleToImport: " << GVFlags.NotEligibleToImport;
|
||||
Out << ", live: " << GVFlags.Live;
|
||||
Out << ", dsoLocal: " << GVFlags.DSOLocal;
|
||||
|
@ -40,6 +40,18 @@ constexpr uint32_t FunctionSummary::ParamAccess::RangeWidth;
|
||||
FunctionSummary FunctionSummary::ExternalNode =
|
||||
FunctionSummary::makeDummyFunctionSummary({});
|
||||
|
||||
GlobalValue::VisibilityTypes ValueInfo::getELFVisibility() const {
|
||||
bool HasProtected = false;
|
||||
for (const auto &S : make_pointee_range(getSummaryList())) {
|
||||
if (S.getVisibility() == GlobalValue::HiddenVisibility)
|
||||
return GlobalValue::HiddenVisibility;
|
||||
if (S.getVisibility() == GlobalValue::ProtectedVisibility)
|
||||
HasProtected = true;
|
||||
}
|
||||
return HasProtected ? GlobalValue::ProtectedVisibility
|
||||
: GlobalValue::DefaultVisibility;
|
||||
}
|
||||
|
||||
bool ValueInfo::isDSOLocal() const {
|
||||
// Need to check all summaries are local in case of hash collisions.
|
||||
return getSummaryList().size() &&
|
||||
@ -564,6 +576,8 @@ void ModuleSummaryIndex::exportToDot(
|
||||
if (Flags.Live && hasConstantFlag(SummaryIt.second))
|
||||
A.addComment("constant");
|
||||
}
|
||||
if (Flags.Visibility)
|
||||
A.addComment("visibility");
|
||||
if (Flags.DSOLocal)
|
||||
A.addComment("dsoLocal");
|
||||
if (Flags.CanAutoHide)
|
||||
|
@ -203,6 +203,7 @@ void llvm::computeLTOCacheKey(
|
||||
|
||||
auto AddUsedThings = [&](GlobalValueSummary *GS) {
|
||||
if (!GS) return;
|
||||
AddUnsigned(GS->getVisibility());
|
||||
AddUnsigned(GS->isLive());
|
||||
AddUnsigned(GS->canAutoHide());
|
||||
for (const ValueInfo &VI : GS->refs()) {
|
||||
@ -315,12 +316,16 @@ void llvm::computeLTOCacheKey(
|
||||
}
|
||||
|
||||
static void thinLTOResolvePrevailingGUID(
|
||||
ValueInfo VI, DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias,
|
||||
const Config &C, ValueInfo VI,
|
||||
DenseSet<GlobalValueSummary *> &GlobalInvolvedWithAlias,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing,
|
||||
function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
|
||||
recordNewLinkage,
|
||||
const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) {
|
||||
GlobalValue::VisibilityTypes Visibility =
|
||||
C.VisibilityScheme == Config::ELF ? VI.getELFVisibility()
|
||||
: GlobalValue::DefaultVisibility;
|
||||
for (auto &S : VI.getSummaryList()) {
|
||||
GlobalValue::LinkageTypes OriginalLinkage = S->linkage();
|
||||
// Ignore local and appending linkage values since the linker
|
||||
@ -352,14 +357,33 @@ static void thinLTOResolvePrevailingGUID(
|
||||
S->setCanAutoHide(VI.canAutoHide() &&
|
||||
!GUIDPreservedSymbols.count(VI.getGUID()));
|
||||
}
|
||||
if (C.VisibilityScheme == Config::FromPrevailing)
|
||||
Visibility = S->getVisibility();
|
||||
}
|
||||
// Alias and aliasee can't be turned into available_externally.
|
||||
else if (!isa<AliasSummary>(S.get()) &&
|
||||
!GlobalInvolvedWithAlias.count(S.get()))
|
||||
S->setLinkage(GlobalValue::AvailableExternallyLinkage);
|
||||
|
||||
// For ELF, set visibility to the computed visibility from summaries. We
|
||||
// don't track visibility from declarations so this may be more relaxed than
|
||||
// the most constraining one.
|
||||
if (C.VisibilityScheme == Config::ELF)
|
||||
S->setVisibility(Visibility);
|
||||
|
||||
if (S->linkage() != OriginalLinkage)
|
||||
recordNewLinkage(S->modulePath(), VI.getGUID(), S->linkage());
|
||||
}
|
||||
|
||||
if (C.VisibilityScheme == Config::FromPrevailing) {
|
||||
for (auto &S : VI.getSummaryList()) {
|
||||
GlobalValue::LinkageTypes OriginalLinkage = S->linkage();
|
||||
if (GlobalValue::isLocalLinkage(OriginalLinkage) ||
|
||||
GlobalValue::isAppendingLinkage(S->linkage()))
|
||||
continue;
|
||||
S->setVisibility(Visibility);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Resolve linkage for prevailing symbols in the \p Index.
|
||||
@ -369,7 +393,7 @@ static void thinLTOResolvePrevailingGUID(
|
||||
// referencing them because of the import. We make sure we always emit at least
|
||||
// one copy.
|
||||
void llvm::thinLTOResolvePrevailingInIndex(
|
||||
ModuleSummaryIndex &Index,
|
||||
const Config &C, ModuleSummaryIndex &Index,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing,
|
||||
function_ref<void(StringRef, GlobalValue::GUID, GlobalValue::LinkageTypes)>
|
||||
@ -385,9 +409,9 @@ void llvm::thinLTOResolvePrevailingInIndex(
|
||||
GlobalInvolvedWithAlias.insert(&AS->getAliasee());
|
||||
|
||||
for (auto &I : Index)
|
||||
thinLTOResolvePrevailingGUID(Index.getValueInfo(I), GlobalInvolvedWithAlias,
|
||||
isPrevailing, recordNewLinkage,
|
||||
GUIDPreservedSymbols);
|
||||
thinLTOResolvePrevailingGUID(C, Index.getValueInfo(I),
|
||||
GlobalInvolvedWithAlias, isPrevailing,
|
||||
recordNewLinkage, GUIDPreservedSymbols);
|
||||
}
|
||||
|
||||
static bool isWeakObjectWithRWAccess(GlobalValueSummary *GVS) {
|
||||
@ -587,8 +611,11 @@ Error LTO::add(std::unique_ptr<InputFile> Input,
|
||||
if (Conf.ResolutionFile)
|
||||
writeToResolutionFile(*Conf.ResolutionFile, Input.get(), Res);
|
||||
|
||||
if (RegularLTO.CombinedModule->getTargetTriple().empty())
|
||||
if (RegularLTO.CombinedModule->getTargetTriple().empty()) {
|
||||
RegularLTO.CombinedModule->setTargetTriple(Input->getTargetTriple());
|
||||
if (Triple(Input->getTargetTriple()).isOSBinFormatELF())
|
||||
Conf.VisibilityScheme = Config::ELF;
|
||||
}
|
||||
|
||||
const SymbolResolution *ResI = Res.begin();
|
||||
for (unsigned I = 0; I != Input->Mods.size(); ++I)
|
||||
@ -1441,7 +1468,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
|
||||
GlobalValue::LinkageTypes NewLinkage) {
|
||||
ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
|
||||
};
|
||||
thinLTOResolvePrevailingInIndex(ThinLTO.CombinedIndex, isPrevailing,
|
||||
thinLTOResolvePrevailingInIndex(Conf, ThinLTO.CombinedIndex, isPrevailing,
|
||||
recordNewLinkage, GUIDPreservedSymbols);
|
||||
|
||||
generateParamAccessSummary(ThinLTO.CombinedIndex);
|
||||
|
@ -507,7 +507,9 @@ static void resolvePrevailingInIndex(
|
||||
ResolvedODR[ModuleIdentifier][GUID] = NewLinkage;
|
||||
};
|
||||
|
||||
thinLTOResolvePrevailingInIndex(Index, isPrevailing, recordNewLinkage,
|
||||
// TODO Conf.VisibilityScheme can be lto::Config::ELF for ELF.
|
||||
lto::Config Conf;
|
||||
thinLTOResolvePrevailingInIndex(Conf, Index, isPrevailing, recordNewLinkage,
|
||||
GUIDPreservedSymbols);
|
||||
}
|
||||
|
||||
|
@ -1000,7 +1000,6 @@ bool llvm::convertToDeclaration(GlobalValue &GV) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Fixup prevailing symbol linkages in \p TheModule based on summary analysis.
|
||||
void llvm::thinLTOResolvePrevailingInModule(
|
||||
Module &TheModule, const GVSummaryMapTy &DefinedGlobals) {
|
||||
auto updateLinkage = [&](GlobalValue &GV) {
|
||||
@ -1009,8 +1008,6 @@ void llvm::thinLTOResolvePrevailingInModule(
|
||||
if (GS == DefinedGlobals.end())
|
||||
return;
|
||||
auto NewLinkage = GS->second->linkage();
|
||||
if (NewLinkage == GV.getLinkage())
|
||||
return;
|
||||
if (GlobalValue::isLocalLinkage(GV.getLinkage()) ||
|
||||
// Don't internalize anything here, because the code below
|
||||
// lacks necessary correctness checks. Leave this job to
|
||||
@ -1020,6 +1017,16 @@ void llvm::thinLTOResolvePrevailingInModule(
|
||||
GV.isDeclaration())
|
||||
return;
|
||||
|
||||
// Set the potentially more constraining visibility computed from summaries.
|
||||
// The DefaultVisibility condition is because older GlobalValueSummary does
|
||||
// not record DefaultVisibility and we don't want to change protected/hidden
|
||||
// to default.
|
||||
if (GS->second->getVisibility() != GlobalValue::DefaultVisibility)
|
||||
GV.setVisibility(GS->second->getVisibility());
|
||||
|
||||
if (NewLinkage == GV.getLinkage())
|
||||
return;
|
||||
|
||||
// Check for a non-prevailing def that has interposable linkage
|
||||
// (e.g. non-odr weak or linkonce). In that case we can't simply
|
||||
// convert to available_externally, since it would lose the
|
||||
|
@ -13,6 +13,6 @@
|
||||
; ModuleID = 'multi-summary-disassemble.o'
|
||||
|
||||
^0 = module: (path: "multi-summary-disassemble.ll", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
^1 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 1)))
|
||||
^1 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 1)))
|
||||
; CHECK: ^0 = module: (path:
|
||||
; CHECK: ^1 = gv: (guid: 3, summaries: (function: (module: ^0,
|
||||
|
@ -8,5 +8,5 @@ source_filename = "index.bc"
|
||||
; CHECK: ^0 = module: (path: "main.bc", hash: (3499594384, 1671013073, 3271036935, 1830411232, 59290952))
|
||||
^1 = module: (path: "[Regular LTO]", hash: (0, 0, 0, 0, 0))
|
||||
; CHECK-NEXT: ^1 = module: (path: "[Regular LTO]", hash: (0, 0, 0, 0, 0))
|
||||
^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 1), insts: 1), function: (module: ^1, flags: (linkage: available_externally, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0), insts: 1)))
|
||||
; CHECK-NEXT: ^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 1), insts: 1), function: (module: ^1, flags: (linkage: available_externally, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0), insts: 1)))
|
||||
^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 1), insts: 1), function: (module: ^1, flags: (linkage: available_externally, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0), insts: 1)))
|
||||
; CHECK-NEXT: ^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 1), insts: 1), function: (module: ^1, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0), insts: 1)))
|
||||
|
13
llvm/test/Assembler/thinlto-summary-visibility.ll
Normal file
13
llvm/test/Assembler/thinlto-summary-visibility.ll
Normal file
@ -0,0 +1,13 @@
|
||||
;; Test visibility parsing in GlobalValueSummary::GVFlags.
|
||||
; RUN: llvm-as %s -o - | llvm-dis -o - | FileCheck %s
|
||||
|
||||
^0 = module: (path: "thinlto-summary-visibility1.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
^1 = module: (path: "thinlto-summary-visibility2.o", hash: (2998369023, 4283347029, 1195487472, 2757298015, 1852134156))
|
||||
|
||||
; CHECK: ^2 = gv: (guid: 2, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 10)))
|
||||
; CHECK-NEXT: ^3 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: external, visibility: protected, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 10)))
|
||||
; CHECK-NEXT: ^4 = gv: (guid: 4, summaries: (function: (module: ^0, flags: (linkage: external, visibility: hidden, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 10)))
|
||||
|
||||
^2 = gv: (guid: 2, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default), insts: 10)))
|
||||
^3 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: external, visibility: protected), insts: 10)))
|
||||
^4 = gv: (guid: 4, summaries: (function: (module: ^0, flags: (linkage: external, visibility: hidden, notEligibleToImport: 0), insts: 10)))
|
@ -9,48 +9,48 @@
|
||||
; Check a function that makes several calls with various profile hotness, and a
|
||||
; reference (also tests forward references to function and variables in calls
|
||||
; and refs).
|
||||
^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: (writeonly ^14, readonly ^13, ^11))))
|
||||
^2 = gv: (guid: 1, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none)), refs: (writeonly ^14, readonly ^13, ^11))))
|
||||
|
||||
; Function with a call that has relative block frequency instead of profile
|
||||
; hotness.
|
||||
^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 10, calls: ((callee: ^15, relbf: 256)))))
|
||||
^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 10, calls: ((callee: ^15, relbf: 256)))))
|
||||
|
||||
; Summaries with different linkage types.
|
||||
^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 1)))
|
||||
^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1), insts: 1)))
|
||||
; Make this one an alias with a forward reference to aliasee.
|
||||
^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: ^14)))
|
||||
^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, 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))))
|
||||
^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: ^14)))
|
||||
^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1), insts: 1)))
|
||||
^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0))))
|
||||
; Test appending globel variable with reference (tests backward reference on
|
||||
; refs).
|
||||
^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0), refs: (^4))))
|
||||
^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0), refs: (^4))))
|
||||
|
||||
; Test a referenced global variable.
|
||||
^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 1))))
|
||||
^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 1))))
|
||||
|
||||
; Test a dsoLocal variable.
|
||||
^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1), varFlags: (writeonly: 0))))
|
||||
^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1), varFlags: (writeonly: 0))))
|
||||
|
||||
; Functions with various flag combinations (notEligibleToImport, Live,
|
||||
; combinations of optional function flags).
|
||||
^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 1, live: 1, dsoLocal: 0), insts: 1, funcFlags: (noInline: 1))))
|
||||
^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1, funcFlags: (readNone: 1, noRecurse: 1, alwaysInline: 1))))
|
||||
^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 0), insts: 1, funcFlags: (noInline: 1))))
|
||||
^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1, funcFlags: (readNone: 1, noRecurse: 1, alwaysInline: 1))))
|
||||
; This one also tests backwards reference in calls.
|
||||
^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1, funcFlags: (readOnly: 1, returnDoesNotAlias: 1), calls: ((callee: ^15)))))
|
||||
^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1, funcFlags: (readOnly: 1, returnDoesNotAlias: 1), calls: ((callee: ^15)))))
|
||||
|
||||
; Alias summary with backwards reference to aliasee.
|
||||
^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: ^14)))
|
||||
^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: ^14)))
|
||||
|
||||
; Test all types of TypeIdInfo on function summaries.
|
||||
^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 4, typeIdInfo: (typeTests: (^24, ^26)))))
|
||||
^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))))))
|
||||
^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))))))
|
||||
^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)))))))
|
||||
^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)))))))
|
||||
^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 4, typeIdInfo: (typeTests: (^24, ^26)))))
|
||||
^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^27, offset: 16))))))
|
||||
^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^25, offset: 16))))))
|
||||
^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (^27, offset: 16), args: (42)), (vFuncId: (^27, offset: 24)))))))
|
||||
^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (^28, offset: 16), args: (42)))))))
|
||||
|
||||
; Test TypeId summaries:
|
||||
|
||||
@ -69,28 +69,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, canAutoHide: 0), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none)), refs: (^11, readonly ^13, writeonly ^14))))
|
||||
; 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, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 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, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, notEligibleToImport: 1, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0))))
|
||||
; 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, alwaysInline: 1))))
|
||||
; 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, alwaysInline: 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: ^2 = gv: (guid: 1, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none)), refs: (^11, readonly ^13, writeonly ^14))))
|
||||
; CHECK: ^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, 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, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), aliasee: ^14)))
|
||||
; CHECK: ^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1), insts: 1)))
|
||||
; CHECK: ^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; CHECK: ^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0), refs: (^4))))
|
||||
; CHECK: ^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0))))
|
||||
; CHECK: ^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1, funcFlags: (readNone: 1, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1))))
|
||||
; CHECK: ^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 1, noRecurse: 0, returnDoesNotAlias: 1, noInline: 0, alwaysInline: 0), calls: ((callee: ^15)))))
|
||||
; CHECK: ^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), aliasee: ^14)))
|
||||
; CHECK: ^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, 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, visibility: default, 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, visibility: default, 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, visibility: default, 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
|
||||
|
@ -29,9 +29,9 @@ declare i32 @_ZN1C1fEi(%struct.C*, i32)
|
||||
|
||||
^0 = module: (path: "<stdin>", hash: (0, 0, 0, 0, 0))
|
||||
^1 = gv: (name: "_ZN1A1nEi") ; guid = 1621563287929432257
|
||||
^2 = gv: (name: "_ZTV1B", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^3, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^3, ^1)))) ; guid = 5283576821522790367
|
||||
^2 = gv: (name: "_ZTV1B", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^3, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^3, ^1)))) ; guid = 5283576821522790367
|
||||
^3 = gv: (name: "_ZN1B1fEi") ; guid = 7162046368816414394
|
||||
^4 = gv: (name: "_ZTV1C", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^5, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^1, ^5)))) ; guid = 13624023785555846296
|
||||
^4 = gv: (name: "_ZTV1C", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^5, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^1, ^5)))) ; guid = 13624023785555846296
|
||||
^5 = gv: (name: "_ZN1C1fEi") ; guid = 14876272565662207556
|
||||
^6 = typeidCompatibleVTable: (name: "_ZTS1A", summary: ((offset: 16, ^2), (offset: 16, ^4))) ; guid = 7004155349499253778
|
||||
^7 = typeidCompatibleVTable: (name: "_ZTS1B", summary: ((offset: 16, ^2))) ; guid = 6203814149063363976
|
||||
|
@ -55,13 +55,13 @@ 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, 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
|
||||
; DIS: ^1 = gv: (name: "analias", summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), aliasee: ^2))) ; guid = 12695095382722328222
|
||||
; DIS: ^2 = gv: (name: "aliasee", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1))) ; guid = 17407585008595848568
|
||||
; DIS: ^3 = blockcount: 1
|
||||
|
||||
; 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, 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)))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 12695095382722328222, summaries: (alias: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), aliasee: ^4)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 15822663052811949562, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^5 = blockcount: 2
|
||||
|
@ -152,16 +152,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, 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: ^9 = gv: (name: "hot_function", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, 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)))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 3741006263754194003, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 5026609803865204483, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 8117347573235780485, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 9453975128311291976, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11668175513417606517, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^7 = gv: (guid: 16213681105727317812, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^8 = gv: (guid: 17381606045411660303, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
|
@ -40,5 +40,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, canAutoHide: 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, visibility: default, 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,18 +148,18 @@ 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, 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: "Z", summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, 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, visibility: default, 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, visibility: default, 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
|
||||
; Check that default value of writeonly attribute is zero for constant variables
|
||||
; DIS-DAG: = gv: (name: "globalvar", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 0, constant: 1)))) ; guid = 12887606300320728018
|
||||
; DIS-DAG: = gv: (name: "globalvar", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 0, constant: 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, 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, writeonly: 1, constant: 0), refs: (^{{.*}})))) ; guid = 16434608426314478903
|
||||
; DIS-DAG: = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 1, constant: 0), 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, canAutoHide: 0), insts: 14, calls: ((callee: ^{{.*}}))))) ; guid =
|
||||
; DIS-DAG: = gv: (name: "Y", summaries: (function: (module: ^0, flags: (linkage: private, visibility: default, 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, 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
|
||||
; DIS: ^2 = gv: (name: "h", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, 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, visibility: default, 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, 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)))))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 8124147457056772133, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, 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, visibility: default, 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, 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: ^2 = gv: (name: "f1", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, 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, 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
|
||||
; DIS: ^6 = gv: (name: "f2", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, 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, visibility: default, 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, visibility: default, 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, 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)))))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 2072045998141807037, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, visibility: default, 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, visibility: default, 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, visibility: default, 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, visibility: default, 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, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323)))))
|
||||
|
@ -23,4 +23,4 @@ entry:
|
||||
}
|
||||
|
||||
attributes #0 = { alwaysinline nounwind uwtable }
|
||||
; CHECK2: ^2 = gv: (guid: {{.*}}, summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1))))
|
||||
; CHECK2: ^2 = gv: (guid: {{.*}}, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1))))
|
||||
|
@ -22,5 +22,5 @@ entry:
|
||||
}
|
||||
|
||||
; CHECK: ^0 = module:
|
||||
; CHECK-NEXT: ^1 = gv: (name: "obj", summaries: (variable: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 1, constant: 0)))) ; guid =
|
||||
; CHECK-NEXT: ^2 = gv: (name: "foo", summaries: (function: (module: ^0, flags: (linkage: external, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 3, refs: (^1)))) ; guid =
|
||||
; CHECK-NEXT: ^1 = gv: (name: "obj", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), varFlags: (readonly: 1, writeonly: 1, constant: 0)))) ; guid =
|
||||
; CHECK-NEXT: ^2 = gv: (name: "foo", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0), insts: 3, refs: (^1)))) ; guid =
|
||||
|
@ -22,7 +22,7 @@
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK: @var1 = external global i32, align 4
|
||||
; CHECK: @var1 = external hidden global i32, align 4
|
||||
; CHECK-NEXT: @var2 = available_externally hidden global i32 1, align 4
|
||||
|
||||
@var1 = weak global i32 1, align 4
|
||||
@ -30,8 +30,8 @@ target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
declare void @ext(void ()*)
|
||||
|
||||
; CHECK: declare i32 @hidden_def_weak_def()
|
||||
; CHECK: declare void @protected_def_weak_def()
|
||||
; CHECK: declare hidden i32 @hidden_def_weak_def()
|
||||
; CHECK: declare protected void @protected_def_weak_def()
|
||||
; CHECK: declare hidden void @protected_def_weak_hidden_def()
|
||||
;; Currently the visibility is not propagated onto an unimported function,
|
||||
;; because we don't have summaries for declarations.
|
||||
@ -45,7 +45,7 @@ declare void @ext(void ()*)
|
||||
|
||||
; CHECK2: define hidden i32 @hidden_def_weak_def()
|
||||
; CHECK2: define protected void @protected_def_weak_def()
|
||||
; CHECK2: define protected void @protected_def_weak_hidden_def()
|
||||
; CHECK2: define hidden void @protected_def_weak_hidden_def()
|
||||
; CHECK2: define hidden void @hidden_def_ref()
|
||||
; CHECK2: define hidden void @hidden_def_weak_ref()
|
||||
; CHECK2: define protected void @protected_def_hidden_ref()
|
||||
|
@ -18,7 +18,7 @@
|
||||
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-macosx10.15.0"
|
||||
|
||||
; CHECK: @var1 = external global i32, align 4
|
||||
; CHECK: @var1 = external hidden global i32, align 4
|
||||
; CHECK-NEXT: @var2 = available_externally hidden global i32 1, align 4
|
||||
|
||||
@var1 = weak global i32 1, align 4
|
||||
@ -26,8 +26,9 @@ target triple = "x86_64-apple-macosx10.15.0"
|
||||
|
||||
declare void @ext(void ()*)
|
||||
|
||||
; CHECK: declare i32 @hidden_def_weak_def()
|
||||
;; Currently the visibility is not propagated for an unimported function.
|
||||
; CHECK: declare hidden i32 @hidden_def_weak_def()
|
||||
;; Currently the visibility is not propagated onto an unimported function,
|
||||
;; because we don't have summaries for declarations.
|
||||
; CHECK: declare extern_weak dso_local void @not_imported()
|
||||
; CHECK: define available_externally hidden void @hidden_def_ref() !thinlto_src_module !0
|
||||
; CHECK: define available_externally hidden void @hidden_def_weak_ref() !thinlto_src_module !0
|
||||
|
@ -5,6 +5,7 @@
|
||||
; SUMMARY: GlobalValueMap:
|
||||
; SUMMARY-NEXT: 42:
|
||||
; SUMMARY-NEXT: - Linkage: 0
|
||||
; SUMMARY-NEXT: Visibility: 0
|
||||
; SUMMARY-NEXT: NotEligibleToImport: false
|
||||
; SUMMARY-NEXT: Live: true
|
||||
; SUMMARY-NEXT: Local: false
|
||||
|
@ -5,6 +5,7 @@
|
||||
; SUMMARY: GlobalValueMap:
|
||||
; SUMMARY-NEXT: 42:
|
||||
; SUMMARY-NEXT: - Linkage: 0
|
||||
; SUMMARY-NEXT: Visibility: 0
|
||||
; SUMMARY-NEXT: NotEligibleToImport: false
|
||||
; SUMMARY-NEXT: Live: true
|
||||
; SUMMARY-NEXT: Local: false
|
||||
|
@ -125,11 +125,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, 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)))))
|
||||
; DIS1: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0), insts: 1)))
|
||||
; DIS1: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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, canAutoHide: 0), insts: 1)))
|
||||
; DIS2: ^1 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, 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…
Reference in New Issue
Block a user