diff options
author | Mehdi Amini <mehdi.amini@apple.com> | 2016-04-24 03:18:18 +0000 |
---|---|---|
committer | Mehdi Amini <mehdi.amini@apple.com> | 2016-04-24 03:18:18 +0000 |
commit | c3ed48c1bdba86f5528778b39c2106ef82670e0c (patch) | |
tree | 01404b89184d2a6dae8462b65e80185c9cdc9043 /llvm/lib/Bitcode | |
parent | 8fe6936e180d12afbbfeb83590baf526395cc272 (diff) | |
download | bcm5719-llvm-c3ed48c1bdba86f5528778b39c2106ef82670e0c.tar.gz bcm5719-llvm-c3ed48c1bdba86f5528778b39c2106ef82670e0c.zip |
Reorganize GlobalValueSummary with a "Flags" bitfield.
Right now it only contains the LinkageType, but will be extended
with "hasSection", "isOptSize", "hasInlineAssembly", etc.
Differential Revision: http://reviews.llvm.org/D19404
From: Mehdi Amini <mehdi.amini@apple.com>
llvm-svn: 267319
Diffstat (limited to 'llvm/lib/Bitcode')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 62 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 38 |
2 files changed, 61 insertions, 39 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 8b583fe4995..0e29c0e77d7 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -738,6 +738,16 @@ static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val) { } } +// Decode the flags for GlobalValue in the summary +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 + return GlobalValueSummary::GVFlags(Linkage); +} + static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val) { switch (Val) { default: // Map unknown visibilities to default. @@ -6051,19 +6061,20 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { switch (BitCode) { default: // Default behavior: ignore. break; - // FS_PERMODULE: [valueid, linkage, instcount, numrefs, numrefs x valueid, + // FS_PERMODULE: [valueid, flags, instcount, numrefs, numrefs x valueid, // n x (valueid, callsitecount)] - // FS_PERMODULE_PROFILE: [valueid, linkage, instcount, numrefs, + // FS_PERMODULE_PROFILE: [valueid, flags, instcount, numrefs, // numrefs x valueid, // n x (valueid, callsitecount, profilecount)] case bitc::FS_PERMODULE: case bitc::FS_PERMODULE_PROFILE: { unsigned ValueID = Record[0]; - uint64_t RawLinkage = Record[1]; + uint64_t RawFlags = Record[1]; unsigned InstCount = Record[2]; unsigned NumRefs = Record[3]; - std::unique_ptr<FunctionSummary> FS = llvm::make_unique<FunctionSummary>( - getDecodedLinkage(RawLinkage), InstCount); + auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); + std::unique_ptr<FunctionSummary> FS = + llvm::make_unique<FunctionSummary>(Flags, InstCount); // The module path string ref set in the summary must be owned by the // index's module string table. Since we don't have a module path // string table section in the per-module index, we create a single @@ -6097,15 +6108,15 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { Info->setSummary(std::move(FS)); break; } - // FS_ALIAS: [valueid, linkage, valueid] + // FS_ALIAS: [valueid, flags, valueid] // Aliases must be emitted (and parsed) after all FS_PERMODULE entries, as // they expect all aliasee summaries to be available. case bitc::FS_ALIAS: { unsigned ValueID = Record[0]; - uint64_t RawLinkage = Record[1]; + uint64_t RawFlags = Record[1]; unsigned AliaseeID = Record[2]; - std::unique_ptr<AliasSummary> AS = - llvm::make_unique<AliasSummary>(getDecodedLinkage(RawLinkage)); + auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); + std::unique_ptr<AliasSummary> AS = llvm::make_unique<AliasSummary>(Flags); // The module path string ref set in the summary must be owned by the // index's module string table. Since we don't have a module path // string table section in the per-module index, we create a single @@ -6127,12 +6138,13 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { Info->setSummary(std::move(AS)); break; } - // FS_PERMODULE_GLOBALVAR_INIT_REFS: [valueid, linkage, n x valueid] + // FS_PERMODULE_GLOBALVAR_INIT_REFS: [valueid, flags, n x valueid] case bitc::FS_PERMODULE_GLOBALVAR_INIT_REFS: { unsigned ValueID = Record[0]; - uint64_t RawLinkage = Record[1]; + uint64_t RawFlags = Record[1]; + auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); std::unique_ptr<GlobalVarSummary> FS = - llvm::make_unique<GlobalVarSummary>(getDecodedLinkage(RawLinkage)); + llvm::make_unique<GlobalVarSummary>(Flags); FS->setModulePath( TheIndex->addModulePath(Buffer->getBufferIdentifier(), 0)->first()); for (unsigned I = 2, E = Record.size(); I != E; ++I) { @@ -6147,19 +6159,20 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { Info->setSummary(std::move(FS)); break; } - // FS_COMBINED: [modid, linkage, instcount, numrefs, numrefs x valueid, + // FS_COMBINED: [modid, flags, instcount, numrefs, numrefs x valueid, // n x (valueid, callsitecount)] - // FS_COMBINED_PROFILE: [modid, linkage, instcount, numrefs, + // FS_COMBINED_PROFILE: [modid, flags, instcount, numrefs, // numrefs x valueid, // n x (valueid, callsitecount, profilecount)] case bitc::FS_COMBINED: case bitc::FS_COMBINED_PROFILE: { uint64_t ModuleId = Record[0]; - uint64_t RawLinkage = Record[1]; + uint64_t RawFlags = Record[1]; unsigned InstCount = Record[2]; unsigned NumRefs = Record[3]; - std::unique_ptr<FunctionSummary> FS = llvm::make_unique<FunctionSummary>( - getDecodedLinkage(RawLinkage), InstCount); + auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); + std::unique_ptr<FunctionSummary> FS = + llvm::make_unique<FunctionSummary>(Flags, InstCount); LastSeenSummary = FS.get(); FS->setModulePath(ModuleIdMap[ModuleId]); static int RefListStartIndex = 4; @@ -6187,15 +6200,15 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { Combined = true; break; } - // FS_COMBINED_ALIAS: [modid, linkage, offset] + // FS_COMBINED_ALIAS: [modid, flags, offset] // Aliases must be emitted (and parsed) after all FS_COMBINED entries, as // they expect all aliasee summaries to be available. case bitc::FS_COMBINED_ALIAS: { uint64_t ModuleId = Record[0]; - uint64_t RawLinkage = Record[1]; + uint64_t RawFlags = Record[1]; uint64_t AliaseeSummaryOffset = Record[2]; - std::unique_ptr<AliasSummary> AS = - llvm::make_unique<AliasSummary>(getDecodedLinkage(RawLinkage)); + auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); + std::unique_ptr<AliasSummary> AS = llvm::make_unique<AliasSummary>(Flags); LastSeenSummary = AS.get(); AS->setModulePath(ModuleIdMap[ModuleId]); @@ -6210,12 +6223,13 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { Combined = true; break; } - // FS_COMBINED_GLOBALVAR_INIT_REFS: [modid, linkage, n x valueid] + // FS_COMBINED_GLOBALVAR_INIT_REFS: [modid, flags, n x valueid] case bitc::FS_COMBINED_GLOBALVAR_INIT_REFS: { uint64_t ModuleId = Record[0]; - uint64_t RawLinkage = Record[1]; + uint64_t RawFlags = Record[1]; + auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); std::unique_ptr<GlobalVarSummary> FS = - llvm::make_unique<GlobalVarSummary>(getDecodedLinkage(RawLinkage)); + llvm::make_unique<GlobalVarSummary>(Flags); LastSeenSummary = FS.get(); FS->setModulePath(ModuleIdMap[ModuleId]); for (unsigned I = 2, E = Record.size(); I != E; ++I) { diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index d0f87e7d9d0..d642dd4be23 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -786,6 +786,14 @@ static unsigned getEncodedLinkage(const GlobalValue &GV) { return getEncodedLinkage(GV.getLinkage()); } +// Decode the flags for GlobalValue in the summary +static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags) { + uint64_t RawFlags = 0; + // Emit Linkage enum. + RawFlags |= Flags.Linkage; // 4 bits + return RawFlags; +} + static unsigned getEncodedVisibility(const GlobalValue &GV) { switch (GV.getVisibility()) { case GlobalValue::DefaultVisibility: return 0; @@ -3023,7 +3031,7 @@ void ModuleBitcodeWriter::writePerModuleFunctionSummaryRecord( NameVals.push_back(ValueID); FunctionSummary *FS = cast<FunctionSummary>(Info->summary()); - NameVals.push_back(getEncodedLinkage(FS->linkage())); + NameVals.push_back(getEncodedGVSummaryFlags(FS->flags())); NameVals.push_back(FS->instCount()); NameVals.push_back(FS->refs().size()); @@ -3057,7 +3065,7 @@ void ModuleBitcodeWriter::writeModuleLevelReferences( if (V.isDeclaration()) return; NameVals.push_back(VE.getValueID(&V)); - NameVals.push_back(getEncodedLinkage(V.getLinkage())); + NameVals.push_back(getEncodedGVSummaryFlags(V)); auto *Info = Index->getGlobalValueInfo(V); GlobalVarSummary *VS = cast<GlobalVarSummary>(Info->summary()); for (auto Ref : VS->refs()) @@ -3081,7 +3089,7 @@ void ModuleBitcodeWriter::writePerModuleGlobalValueSummary() { if (Index->begin() == Index->end()) return; - Stream.EnterSubblock(bitc::GLOBALVAL_SUMMARY_BLOCK_ID, 3); + Stream.EnterSubblock(bitc::GLOBALVAL_SUMMARY_BLOCK_ID, 4); Stream.EmitRecord(bitc::FS_VERSION, ArrayRef<uint64_t>{INDEX_VERSION}); @@ -3089,7 +3097,7 @@ void ModuleBitcodeWriter::writePerModuleGlobalValueSummary() { BitCodeAbbrev *Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs // numrefs x valueid, n x (valueid, callsitecount) @@ -3101,7 +3109,7 @@ void ModuleBitcodeWriter::writePerModuleGlobalValueSummary() { Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_PROFILE)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs // numrefs x valueid, n x (valueid, callsitecount, profilecount) @@ -3113,7 +3121,7 @@ void ModuleBitcodeWriter::writePerModuleGlobalValueSummary() { Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_GLOBALVAR_INIT_REFS)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); // valueids Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); unsigned FSModRefsAbbrev = Stream.EmitAbbrev(Abbv); @@ -3122,7 +3130,7 @@ void ModuleBitcodeWriter::writePerModuleGlobalValueSummary() { Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_ALIAS)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid unsigned FSAliasAbbrev = Stream.EmitAbbrev(Abbv); @@ -3157,7 +3165,7 @@ void ModuleBitcodeWriter::writePerModuleGlobalValueSummary() { auto AliasId = VE.getValueID(&A); auto AliaseeId = VE.getValueID(Aliasee); NameVals.push_back(AliasId); - NameVals.push_back(getEncodedLinkage(A.getLinkage())); + NameVals.push_back(getEncodedGVSummaryFlags(A)); NameVals.push_back(AliaseeId); Stream.EmitRecord(bitc::FS_ALIAS, NameVals, FSAliasAbbrev); NameVals.clear(); @@ -3175,7 +3183,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { BitCodeAbbrev *Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs // numrefs x valueid, n x (valueid, callsitecount) @@ -3187,7 +3195,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_PROFILE)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs // numrefs x valueid, n x (valueid, callsitecount, profilecount) @@ -3199,7 +3207,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_GLOBALVAR_INIT_REFS)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); // valueids Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); unsigned FSModRefsAbbrev = Stream.EmitAbbrev(Abbv); @@ -3208,7 +3216,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_ALIAS)); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid - Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // linkage + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // offset unsigned FSAliasAbbrev = Stream.EmitAbbrev(Abbv); @@ -3243,7 +3251,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { if (auto *VS = dyn_cast<GlobalVarSummary>(S)) { NameVals.push_back(Index.getModuleId(VS->modulePath())); - NameVals.push_back(getEncodedLinkage(VS->linkage())); + NameVals.push_back(getEncodedGVSummaryFlags(VS->flags())); for (auto &RI : VS->refs()) { NameVals.push_back(getValueId(RI.getGUID())); } @@ -3266,7 +3274,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { auto *FS = cast<FunctionSummary>(S); NameVals.push_back(Index.getModuleId(FS->modulePath())); - NameVals.push_back(getEncodedLinkage(FS->linkage())); + NameVals.push_back(getEncodedGVSummaryFlags(FS->flags())); NameVals.push_back(FS->instCount()); NameVals.push_back(FS->refs().size()); @@ -3315,7 +3323,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { for (auto GVI : Aliases) { AliasSummary *AS = cast<AliasSummary>(GVI->summary()); NameVals.push_back(Index.getModuleId(AS->modulePath())); - NameVals.push_back(getEncodedLinkage(AS->linkage())); + NameVals.push_back(getEncodedGVSummaryFlags(AS->flags())); auto AliaseeOffset = SummaryToOffsetMap[&AS->getAliasee()]; assert(AliaseeOffset); NameVals.push_back(AliaseeOffset); |