Index: include/llvm/Bitcode/LLVMBitCodes.h =================================================================== --- include/llvm/Bitcode/LLVMBitCodes.h +++ include/llvm/Bitcode/LLVMBitCodes.h @@ -212,8 +212,8 @@ FS_ALIAS = 7, // COMBINED_ALIAS: [valueid, modid, flags, valueid] FS_COMBINED_ALIAS = 8, - // COMBINED_ORIGINAL_NAME: [original_name_hash] - FS_COMBINED_ORIGINAL_NAME = 9, + // ORIGINAL_NAME: [original_name_hash] + FS_ORIGINAL_NAME = 9, // VERSION of the summary, bumped when adding flags for instance. FS_VERSION = 10, // The list of llvm.type.test type identifiers used by the following function Index: lib/Bitcode/Reader/BitcodeReader.cpp =================================================================== --- lib/Bitcode/Reader/BitcodeReader.cpp +++ lib/Bitcode/Reader/BitcodeReader.cpp @@ -4803,7 +4803,7 @@ unsigned ValueID = Record[0]; GlobalValue::GUID RefGUID = Record[1]; // The "original name", which is the second value of the pair will be - // overriden later by a FS_COMBINED_ORIGINAL_NAME in the combined index. + // overriden later by a FS_ORIGINAL_NAME in the combined index. ValueIdToValueInfoMap[ValueID] = std::make_pair(TheIndex.getOrInsertValueInfo(RefGUID), RefGUID); break; @@ -5083,6 +5083,8 @@ auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID); FS->setModulePath(addThisModule()->first()); FS->setOriginalName(VIAndOriginalGUID.second); + LastSeenSummary = FS.get(); + LastSeenGUID = getValueInfoFromValueId(ValueID).first.getGUID(); TheIndex.addGlobalValueSummary(VIAndOriginalGUID.first, std::move(FS)); break; } @@ -5113,6 +5115,8 @@ auto GUID = getValueInfoFromValueId(ValueID); AS->setOriginalName(GUID.second); + LastSeenSummary = AS.get(); + LastSeenGUID = getValueInfoFromValueId(ValueID).first.getGUID(); TheIndex.addGlobalValueSummary(GUID.first, std::move(AS)); break; } @@ -5127,6 +5131,8 @@ FS->setModulePath(addThisModule()->first()); auto GUID = getValueInfoFromValueId(ValueID); FS->setOriginalName(GUID.second); + LastSeenSummary = FS.get(); + LastSeenGUID = getValueInfoFromValueId(ValueID).first.getGUID(); TheIndex.addGlobalValueSummary(GUID.first, std::move(FS)); break; } @@ -5212,11 +5218,11 @@ TheIndex.addGlobalValueSummary(VI, std::move(FS)); break; } - // FS_COMBINED_ORIGINAL_NAME: [original_name] - case bitc::FS_COMBINED_ORIGINAL_NAME: { + // FS_ORIGINAL_NAME: [original_name] + case bitc::FS_ORIGINAL_NAME: { uint64_t OriginalName = Record[0]; if (!LastSeenSummary) - return error("Name attachment that does not follow a combined record"); + return error("Name attachment that does not follow a summary record"); LastSeenSummary->setOriginalName(OriginalName); TheIndex.addOriginalName(LastSeenGUID, OriginalName); // Reset the LastSeenSummary Index: lib/Bitcode/Writer/BitcodeWriter.cpp =================================================================== --- lib/Bitcode/Writer/BitcodeWriter.cpp +++ lib/Bitcode/Writer/BitcodeWriter.cpp @@ -3254,6 +3254,9 @@ SmallVector &NameVals, GlobalValueSummary *Summary, unsigned ValueID, unsigned FSCallsAbbrev, unsigned FSCallsProfileAbbrev, const Function &F) { + auto GUID = F.getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{ValueID, GUID}); NameVals.push_back(ValueID); FunctionSummary *FS = cast(Summary); @@ -3263,12 +3266,21 @@ NameVals.push_back(FS->instCount()); NameVals.push_back(FS->refs().size()); - for (auto &RI : FS->refs()) - NameVals.push_back(VE.getValueID(RI.getValue())); + for (auto &RI : FS->refs()) { + auto RefValueID = VE.getValueID(RI.getValue()); + auto RefGUID = RI.getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{RefValueID, RefGUID}); + NameVals.push_back(RefValueID); + } bool HasProfileData = F.getEntryCount().hasValue(); for (auto &ECI : FS->calls()) { - NameVals.push_back(getValueId(ECI.first)); + auto CallValueID = getValueId(ECI.first); + auto CallGUID = ECI.first.getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{CallValueID, CallGUID}); + NameVals.push_back(CallValueID); if (HasProfileData) NameVals.push_back(static_cast(ECI.second.Hotness)); } @@ -3295,13 +3307,22 @@ return; } auto *Summary = VI.getSummaryList()[0].get(); - NameVals.push_back(VE.getValueID(&V)); + auto ValueID = VE.getValueID(&V); + auto GUID = V.getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{ValueID, GUID}); + NameVals.push_back(ValueID); GlobalVarSummary *VS = cast(Summary); NameVals.push_back(getEncodedGVSummaryFlags(VS->flags())); unsigned SizeBeforeRefs = NameVals.size(); - for (auto &RI : VS->refs()) - NameVals.push_back(VE.getValueID(RI.getValue())); + for (auto &RI : VS->refs()) { + auto RefValueID = VE.getValueID(RI.getValue()); + auto RefGUID = RI.getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{RefValueID, RefGUID}); + NameVals.push_back(RefValueID); + } // Sort the refs for determinism output, the vector returned by FS->refs() has // been initialized from a DenseSet. std::sort(NameVals.begin() + SizeBeforeRefs, NameVals.end()); @@ -3383,6 +3404,15 @@ unsigned FSAliasAbbrev = Stream.EmitAbbrev(std::move(Abbv)); SmallVector NameVals; + // OriginalName's GUID is used in samplePGO, so we add it mseparately + // immediately after the record. + auto MaybeEmitOriginalName = [&](const GlobalValue &GV) { + if (!GlobalValue::isLocalLinkage(GV.getLinkage())) + return; + NameVals.push_back(GlobalValue::getGUID(GV.getValueName()->getKey())); + Stream.EmitRecord(bitc::FS_ORIGINAL_NAME, NameVals); + NameVals.clear(); + }; // Iterate over the list of functions instead of the Index to // ensure the ordering is stable. for (const Function &F : M) { @@ -3401,12 +3431,15 @@ auto *Summary = VI.getSummaryList()[0].get(); writePerModuleFunctionSummaryRecord(NameVals, Summary, VE.getValueID(&F), FSCallsAbbrev, FSCallsProfileAbbrev, F); + MaybeEmitOriginalName(F); } // Capture references from GlobalVariable initializers, which are outside // of a function scope. - for (const GlobalVariable &G : M.globals()) + for (const GlobalVariable &G : M.globals()) { writeModuleLevelReferences(G, NameVals, FSModRefsAbbrev); + MaybeEmitOriginalName(G); + } for (const GlobalAlias &A : M.aliases()) { auto *Aliasee = A.getBaseObject(); @@ -3415,13 +3448,21 @@ continue; auto AliasId = VE.getValueID(&A); auto AliaseeId = VE.getValueID(Aliasee); + auto GUID = A.getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{AliasId, GUID}); NameVals.push_back(AliasId); auto *Summary = Index->getGlobalValueSummary(A); AliasSummary *AS = cast(Summary); NameVals.push_back(getEncodedGVSummaryFlags(AS->flags())); + + auto AliaseeGUID = Aliasee->getGUID(); + Stream.EmitRecord(bitc::FS_VALUE_GUID, + ArrayRef{AliaseeId, AliaseeGUID}); NameVals.push_back(AliaseeId); Stream.EmitRecord(bitc::FS_ALIAS, NameVals, FSAliasAbbrev); NameVals.clear(); + MaybeEmitOriginalName(A); } Stream.ExitBlock(); @@ -3497,7 +3538,7 @@ if (!GlobalValue::isLocalLinkage(S.linkage())) return; NameVals.push_back(S.getOriginalName()); - Stream.EmitRecord(bitc::FS_COMBINED_ORIGINAL_NAME, NameVals); + Stream.EmitRecord(bitc::FS_ORIGINAL_NAME, NameVals); NameVals.clear(); }; Index: tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp =================================================================== --- tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp +++ tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp @@ -317,7 +317,7 @@ STRINGIFY_CODE(FS, COMBINED_GLOBALVAR_INIT_REFS) STRINGIFY_CODE(FS, ALIAS) STRINGIFY_CODE(FS, COMBINED_ALIAS) - STRINGIFY_CODE(FS, COMBINED_ORIGINAL_NAME) + STRINGIFY_CODE(FS, ORIGINAL_NAME) STRINGIFY_CODE(FS, VERSION) STRINGIFY_CODE(FS, TYPE_TESTS) STRINGIFY_CODE(FS, TYPE_TEST_ASSUME_VCALLS)