diff options
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 85 |
1 files changed, 29 insertions, 56 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 90934cc30a1..b2b25df5c5d 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -492,11 +492,6 @@ class ModuleSummaryIndexBitcodeReader { DenseMap<unsigned, std::pair<GlobalValue::GUID, GlobalValue::GUID>> ValueIdToCallGraphGUIDMap; - /// Map to save the association between summary offset in the VST to the - /// GUID created when parsing it. Used to add newly parsed summaries to - /// the index. - DenseMap<uint64_t, GlobalValue::GUID> SummaryOffsetToGUIDMap; - /// Map populated during module path string table parsing, from the /// module ID to a string reference owned by the index's module /// path string table, used to correlate with combined index @@ -548,7 +543,6 @@ private: std::error_code initLazyStream(std::unique_ptr<DataStreamer> Streamer); std::pair<GlobalValue::GUID, GlobalValue::GUID> getGUIDFromValueId(unsigned ValueId); - GlobalValue::GUID getGUIDFromOffset(uint64_t Offset); }; } // end anonymous namespace @@ -5740,13 +5734,6 @@ ModuleSummaryIndexBitcodeReader::getGUIDFromValueId(unsigned ValueId) { return VGI->second; } -GlobalValue::GUID -ModuleSummaryIndexBitcodeReader::getGUIDFromOffset(uint64_t Offset) { - auto I = SummaryOffsetToGUIDMap.find(Offset); - assert(I != SummaryOffsetToGUIDMap.end()); - return I->second; -} - // Specialized value symbol table parser used when reading module index // blocks where we don't actually create global values. The parsed information // is saved in the bitcode reader for use when later parsing summaries. @@ -5832,18 +5819,6 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseValueSymbolTable( ValueName.clear(); break; } - case bitc::VST_CODE_COMBINED_GVDEFENTRY: { - // VST_CODE_COMBINED_GVDEFENTRY: [valueid, offset, guid] - unsigned ValueID = Record[0]; - uint64_t GlobalValSummaryOffset = Record[1]; - GlobalValue::GUID GlobalValGUID = Record[2]; - SummaryOffsetToGUIDMap[GlobalValSummaryOffset] = GlobalValGUID; - // 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. - ValueIdToCallGraphGUIDMap[ValueID] = - std::make_pair(GlobalValGUID, GlobalValGUID); - break; - } case bitc::VST_CODE_COMBINED_ENTRY: { // VST_CODE_COMBINED_ENTRY: [valueid, refguid] unsigned ValueID = Record[0]; @@ -6030,11 +6005,6 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { // "OriginalName" attachement. GlobalValueSummary *LastSeenSummary = nullptr; bool Combined = false; - // For aliases in the combined summary, we need to know which summary - // corresponds to the aliasee offset saved in the alias summary. It isn't - // sufficient to just map to the aliasee GUID, since in the combined summary - // there may be multiple values with the same GUID. - DenseMap<uint64_t, GlobalValueSummary *> OffsetToSummaryMap; while (1) { BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); @@ -6067,7 +6037,6 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { // in the combined index VST entries). The records also contain // information used for ThinLTO renaming and importing. Record.clear(); - uint64_t CurRecordBit = Stream.GetCurrentBitNo(); auto BitCode = Stream.readRecord(Entry.ID, Record); switch (BitCode) { default: // Default behavior: ignore. @@ -6164,27 +6133,29 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { TheIndex->addGlobalValueSummary(GUID.first, std::move(FS)); break; } - // FS_COMBINED: [modid, flags, instcount, numrefs, numrefs x valueid, - // n x (valueid, callsitecount)] - // FS_COMBINED_PROFILE: [modid, flags, instcount, numrefs, + // FS_COMBINED: [valueid, modid, flags, instcount, numrefs, + // numrefs x valueid, n x (valueid, callsitecount)] + // FS_COMBINED_PROFILE: [valueid, 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 RawFlags = Record[1]; - unsigned InstCount = Record[2]; - unsigned NumRefs = Record[3]; + unsigned ValueID = Record[0]; + uint64_t ModuleId = Record[1]; + uint64_t RawFlags = Record[2]; + unsigned InstCount = Record[3]; + unsigned NumRefs = Record[4]; 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; + static int RefListStartIndex = 5; int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs; assert(Record.size() >= RefListStartIndex + NumRefs && "Record size inconsistent with number of references"); - for (unsigned I = 4, E = CallGraphEdgeStartIndex; I != E; ++I) { + for (unsigned I = RefListStartIndex, E = CallGraphEdgeStartIndex; I != E; + ++I) { unsigned RefValueId = Record[I]; GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first; FS->addRefEdge(RefGUID); @@ -6199,50 +6170,52 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { FS->addCallGraphEdge(CalleeGUID, CalleeInfo(CallsiteCount, ProfileCount)); } - GlobalValue::GUID GUID = getGUIDFromOffset(CurRecordBit); - OffsetToSummaryMap[CurRecordBit] = FS.get(); + GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first; TheIndex->addGlobalValueSummary(GUID, std::move(FS)); Combined = true; break; } - // FS_COMBINED_ALIAS: [modid, flags, offset] + // FS_COMBINED_ALIAS: [valueid, modid, flags, valueid] // 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 RawFlags = Record[1]; - uint64_t AliaseeSummaryOffset = Record[2]; + unsigned ValueID = Record[0]; + uint64_t ModuleId = Record[1]; + uint64_t RawFlags = Record[2]; + unsigned AliaseeValueId = Record[3]; auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); std::unique_ptr<AliasSummary> AS = llvm::make_unique<AliasSummary>(Flags); LastSeenSummary = AS.get(); AS->setModulePath(ModuleIdMap[ModuleId]); - auto *AliaseeSummary = OffsetToSummaryMap[AliaseeSummaryOffset]; - if (!AliaseeSummary) + auto AliaseeGUID = getGUIDFromValueId(AliaseeValueId).first; + auto AliaseeInModule = + TheIndex->findSummaryInModule(AliaseeGUID, AS->modulePath()); + if (!AliaseeInModule) return error("Alias expects aliasee summary to be parsed"); - AS->setAliasee(AliaseeSummary); + AS->setAliasee(AliaseeInModule); - GlobalValue::GUID GUID = getGUIDFromOffset(CurRecordBit); + GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first; TheIndex->addGlobalValueSummary(GUID, std::move(AS)); Combined = true; break; } - // FS_COMBINED_GLOBALVAR_INIT_REFS: [modid, flags, n x valueid] + // FS_COMBINED_GLOBALVAR_INIT_REFS: [valueid, modid, flags, n x valueid] case bitc::FS_COMBINED_GLOBALVAR_INIT_REFS: { - uint64_t ModuleId = Record[0]; - uint64_t RawFlags = Record[1]; + unsigned ValueID = Record[0]; + uint64_t ModuleId = Record[1]; + uint64_t RawFlags = Record[2]; auto Flags = getDecodedGVSummaryFlags(RawFlags, Version); std::unique_ptr<GlobalVarSummary> FS = llvm::make_unique<GlobalVarSummary>(Flags); LastSeenSummary = FS.get(); FS->setModulePath(ModuleIdMap[ModuleId]); - for (unsigned I = 2, E = Record.size(); I != E; ++I) { + for (unsigned I = 3, E = Record.size(); I != E; ++I) { unsigned RefValueId = Record[I]; GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first; FS->addRefEdge(RefGUID); } - GlobalValue::GUID GUID = getGUIDFromOffset(CurRecordBit); - OffsetToSummaryMap[CurRecordBit] = FS.get(); + GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first; TheIndex->addGlobalValueSummary(GUID, std::move(FS)); Combined = true; break; |