diff --git a/lld/test/COFF/thinlto-index-only.ll b/lld/test/COFF/thinlto-index-only.ll --- a/lld/test/COFF/thinlto-index-only.ll +++ b/lld/test/COFF/thinlto-index-only.ll @@ -49,8 +49,8 @@ ; RUN: llvm-ar rcsT %t5.lib %t/bar.obj %t3.obj ; RUN: lld-link -thinlto-index-only -entry:main %t/foo.obj %t5.lib ; RUN: llvm-dis -o - %t/foo.obj.thinlto.bc | FileCheck %s --check-prefix=THINARCHIVE -; THINARCHIVE: ^0 = module: (path: "{{.*}}foo.obj", -; THINARCHIVE: ^1 = module: (path: "{{.*}}bar.obj", +; THINARCHIVE: ^0 = module: (path: "{{.*}}bar.obj", +; THINARCHIVE: ^1 = module: (path: "{{.*}}foo.obj", target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-windows-msvc19.0.24215" diff --git a/llvm/include/llvm/Bitcode/BitcodeReader.h b/llvm/include/llvm/Bitcode/BitcodeReader.h --- a/llvm/include/llvm/Bitcode/BitcodeReader.h +++ b/llvm/include/llvm/Bitcode/BitcodeReader.h @@ -158,7 +158,6 @@ /// into CombinedIndex. Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, - uint64_t ModuleId, std::function IsPrevailing = nullptr); }; @@ -225,8 +224,7 @@ /// Parse the specified bitcode buffer and merge the index into CombinedIndex. Error readModuleSummaryIndex(MemoryBufferRef Buffer, - ModuleSummaryIndex &CombinedIndex, - uint64_t ModuleId); + ModuleSummaryIndex &CombinedIndex); /// Parse the module summary index out of an IR file and return the module /// summary index object if found, or an empty summary if not. If Path refers diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h --- a/llvm/include/llvm/IR/ModuleSummaryIndex.h +++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -1225,10 +1225,9 @@ using const_gvsummary_iterator = GlobalValueSummaryMapTy::const_iterator; using gvsummary_iterator = GlobalValueSummaryMapTy::iterator; -/// String table to hold/own module path strings, which additionally holds the -/// module ID assigned to each module during the plugin step, as well as a hash +/// String table to hold/own module path strings, as well as a hash /// of the module. The StringMap makes a copy of and owns inserted strings. -using ModulePathStringTableTy = StringMap>; +using ModulePathStringTableTy = StringMap; /// Map of global value GUID to its summary, used to identify values defined in /// a particular module, and provide efficient access to their summary. @@ -1674,25 +1673,18 @@ bool PerModuleIndex = true) const; /// Table of modules, containing module hash and id. - const StringMap> &modulePaths() const { + const StringMap &modulePaths() const { return ModulePathStringTable; } /// Table of modules, containing hash and id. - StringMap> &modulePaths() { - return ModulePathStringTable; - } - - /// Get the module ID recorded for the given module path. - uint64_t getModuleId(const StringRef ModPath) const { - return ModulePathStringTable.lookup(ModPath).first; - } + StringMap &modulePaths() { return ModulePathStringTable; } /// Get the module SHA1 hash recorded for the given module path. const ModuleHash &getModuleHash(const StringRef ModPath) const { auto It = ModulePathStringTable.find(ModPath); assert(It != ModulePathStringTable.end() && "Module not registered"); - return It->second.second; + return It->second; } /// Convenience method for creating a promoted global name @@ -1723,9 +1715,8 @@ /// Add a new module with the given \p Hash, mapped to the given \p /// ModID, and return a reference to the module. - ModuleInfo *addModule(StringRef ModPath, uint64_t ModId, - ModuleHash Hash = ModuleHash{{0}}) { - return &*ModulePathStringTable.insert({ModPath, {ModId, Hash}}).first; + ModuleInfo *addModule(StringRef ModPath, ModuleHash Hash = ModuleHash{{0}}) { + return &*ModulePathStringTable.insert({ModPath, Hash}).first; } /// Return module entry for module with the given \p ModPath. diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -8179,7 +8179,7 @@ parseToken(lltok::rparen, "expected ')' here")) return true; - auto ModuleEntry = Index->addModule(Path, ID, Hash); + auto ModuleEntry = Index->addModule(Path, Hash); ModuleIdMap[ID] = ModuleEntry->first(); return false; diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -904,10 +904,6 @@ /// path to the bitcode file. StringRef ModulePath; - /// For per-module summary indexes, the unique numerical identifier given to - /// this module by the client. - unsigned ModuleId; - /// Callback to ask whether a symbol is the prevailing copy when invoked /// during combined index building. std::function IsPrevailing; @@ -919,7 +915,7 @@ public: ModuleSummaryIndexBitcodeReader( BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex, - StringRef ModulePath, unsigned ModuleId, + StringRef ModulePath, std::function IsPrevailing = nullptr); Error parseModule(); @@ -6699,13 +6695,12 @@ ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader( BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex, - StringRef ModulePath, unsigned ModuleId, - std::function IsPrevailing) + StringRef ModulePath, std::function IsPrevailing) : BitcodeReaderBase(std::move(Cursor), Strtab), TheIndex(TheIndex), - ModulePath(ModulePath), ModuleId(ModuleId), IsPrevailing(IsPrevailing) {} + ModulePath(ModulePath), IsPrevailing(IsPrevailing) {} void ModuleSummaryIndexBitcodeReader::addThisModule() { - TheIndex.addModule(ModulePath, ModuleId); + TheIndex.addModule(ModulePath); } ModuleSummaryIndex::ModuleInfo * @@ -6936,7 +6931,7 @@ case bitc::MODULE_CODE_HASH: { if (Record.size() != 5) return error("Invalid hash length " + Twine(Record.size()).str()); - auto &Hash = getThisModule()->second.second; + auto &Hash = getThisModule()->second; int Pos = 0; for (auto &Val : Record) { assert(!(Val >> 32) && "Unexpected high bits set"); @@ -7697,7 +7692,7 @@ if (convertToString(Record, 1, ModulePath)) return error("Invalid record"); - LastSeenModule = TheIndex.addModule(ModulePath, ModuleId); + LastSeenModule = TheIndex.addModule(ModulePath); ModuleIdMap[ModuleId] = LastSeenModule->first(); ModulePath.clear(); @@ -7712,7 +7707,7 @@ int Pos = 0; for (auto &Val : Record) { assert(!(Val >> 32) && "Unexpected high bits set"); - LastSeenModule->second.second[Pos++] = Val; + LastSeenModule->second[Pos++] = Val; } // Reset LastSeenModule to avoid overriding the hash unexpectedly. LastSeenModule = nullptr; @@ -7970,14 +7965,14 @@ // module path used in the combined summary (e.g. when reading summaries for // regular LTO modules). Error BitcodeModule::readSummary( - ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, uint64_t ModuleId, + ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function IsPrevailing) { BitstreamCursor Stream(Buffer); if (Error JumpFailed = Stream.JumpToBit(ModuleBit)) return JumpFailed; ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex, - ModulePath, ModuleId, IsPrevailing); + ModulePath, IsPrevailing); return R.parseModule(); } @@ -8183,13 +8178,12 @@ } Error llvm::readModuleSummaryIndex(MemoryBufferRef Buffer, - ModuleSummaryIndex &CombinedIndex, - uint64_t ModuleId) { + ModuleSummaryIndex &CombinedIndex) { Expected BM = getSingleModule(Buffer); if (!BM) return BM.takeError(); - return BM->readSummary(CombinedIndex, BM->getModuleIdentifier(), ModuleId); + return BM->readSummary(CombinedIndex, BM->getModuleIdentifier()); } Expected> diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -431,6 +431,10 @@ /// Tracks the last value id recorded in the GUIDToValueMap. unsigned GlobalValueId = 0; + /// Tracks the assignment of module paths in the module path string table to + /// an id assigned for use in summary references to the module path. + DenseMap ModuleIdMap; + public: /// Constructs a IndexBitcodeWriter object for the given combined index, /// writing to the provided \p Buffer. When writing a subset of the index @@ -3715,33 +3719,33 @@ unsigned AbbrevHash = Stream.EmitAbbrev(std::move(Abbv)); SmallVector Vals; - forEachModule( - [&](const StringMapEntry> &MPSE) { - StringRef Key = MPSE.getKey(); - const auto &Value = MPSE.getValue(); - StringEncoding Bits = getStringEncoding(Key); - unsigned AbbrevToUse = Abbrev8Bit; - if (Bits == SE_Char6) - AbbrevToUse = Abbrev6Bit; - else if (Bits == SE_Fixed7) - AbbrevToUse = Abbrev7Bit; - - Vals.push_back(Value.first); - Vals.append(Key.begin(), Key.end()); - - // Emit the finished record. - Stream.EmitRecord(bitc::MST_CODE_ENTRY, Vals, AbbrevToUse); - - // Emit an optional hash for the module now - const auto &Hash = Value.second; - if (llvm::any_of(Hash, [](uint32_t H) { return H; })) { - Vals.assign(Hash.begin(), Hash.end()); - // Emit the hash record. - Stream.EmitRecord(bitc::MST_CODE_HASH, Vals, AbbrevHash); - } + forEachModule([&](const StringMapEntry &MPSE) { + StringRef Key = MPSE.getKey(); + const auto &Hash = MPSE.getValue(); + StringEncoding Bits = getStringEncoding(Key); + unsigned AbbrevToUse = Abbrev8Bit; + if (Bits == SE_Char6) + AbbrevToUse = Abbrev6Bit; + else if (Bits == SE_Fixed7) + AbbrevToUse = Abbrev7Bit; - Vals.clear(); - }); + auto ModuleId = ModuleIdMap.size(); + ModuleIdMap[Key] = ModuleId; + Vals.push_back(ModuleId); + Vals.append(Key.begin(), Key.end()); + + // Emit the finished record. + Stream.EmitRecord(bitc::MST_CODE_ENTRY, Vals, AbbrevToUse); + + // Emit an optional hash for the module now + if (llvm::any_of(Hash, [](uint32_t H) { return H; })) { + Vals.assign(Hash.begin(), Hash.end()); + // Emit the hash record. + Stream.EmitRecord(bitc::MST_CODE_HASH, Vals, AbbrevHash); + } + + Vals.clear(); + }); Stream.ExitBlock(); } @@ -4410,7 +4414,8 @@ if (auto *VS = dyn_cast(S)) { NameVals.push_back(*ValueId); - NameVals.push_back(Index.getModuleId(VS->modulePath())); + assert(ModuleIdMap.count(VS->modulePath())); + NameVals.push_back(ModuleIdMap[VS->modulePath()]); NameVals.push_back(getEncodedGVSummaryFlags(VS->flags())); NameVals.push_back(getEncodedGVarFlags(VS->varflags())); for (auto &RI : VS->refs()) { @@ -4460,7 +4465,8 @@ }); NameVals.push_back(*ValueId); - NameVals.push_back(Index.getModuleId(FS->modulePath())); + assert(ModuleIdMap.count(FS->modulePath())); + NameVals.push_back(ModuleIdMap[FS->modulePath()]); NameVals.push_back(getEncodedGVSummaryFlags(FS->flags())); NameVals.push_back(FS->instCount()); NameVals.push_back(getEncodedFFlags(FS->fflags())); @@ -4520,7 +4526,8 @@ auto AliasValueId = SummaryToValueIdMap[AS]; assert(AliasValueId); NameVals.push_back(AliasValueId); - NameVals.push_back(Index.getModuleId(AS->modulePath())); + assert(ModuleIdMap.count(AS->modulePath())); + NameVals.push_back(ModuleIdMap[AS->modulePath()]); NameVals.push_back(getEncodedGVSummaryFlags(AS->flags())); auto AliaseeValueId = SummaryToValueIdMap[&AS->getAliasee()]; assert(AliaseeValueId); diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1069,12 +1069,13 @@ // The first block of slots are just the module ids, which start at 0 and are // assigned consecutively. Since the StringMap iteration order isn't - // guaranteed, use a std::map to order by module ID before assigning slots. - std::map ModuleIdToPathMap; - for (auto &[ModPath, ModId] : TheIndex->modulePaths()) - ModuleIdToPathMap[ModId.first] = ModPath; - for (auto &ModPair : ModuleIdToPathMap) - CreateModulePathSlot(ModPair.second); + // guaranteed, order by path string before assigning slots. + std::vector ModulePaths; + for (auto &[ModPath, _] : TheIndex->modulePaths()) + ModulePaths.push_back(ModPath); + llvm::sort(ModulePaths.begin(), ModulePaths.end()); + for (auto &ModPath : ModulePaths) + CreateModulePathSlot(ModPath); // Start numbering the GUIDs after the module ids. GUIDNext = ModulePathNext; @@ -2890,12 +2891,11 @@ std::string RegularLTOModuleName = ModuleSummaryIndex::getRegularLTOModuleName(); moduleVec.resize(TheIndex->modulePaths().size()); - for (auto &[ModPath, ModId] : TheIndex->modulePaths()) + for (auto &[ModPath, ModHash] : TheIndex->modulePaths()) moduleVec[Machine.getModulePathSlot(ModPath)] = std::make_pair( - // A module id of -1 is a special entry for a regular LTO module created - // during the thin link. - ModId.first == -1u ? RegularLTOModuleName : std::string(ModPath), - ModId.second); + // An empty module path is a special entry for a regular LTO module + // created during the thin link. + ModPath.empty() ? RegularLTOModuleName : std::string(ModPath), ModHash); unsigned i = 0; for (auto &ModPair : moduleVec) { diff --git a/llvm/lib/IR/ModuleSummaryIndex.cpp b/llvm/lib/IR/ModuleSummaryIndex.cpp --- a/llvm/lib/IR/ModuleSummaryIndex.cpp +++ b/llvm/lib/IR/ModuleSummaryIndex.cpp @@ -554,6 +554,17 @@ std::map ModuleToDefinedGVS; collectDefinedGVSummariesPerModule(ModuleToDefinedGVS); + // Assign an id to each module path for use in graph labels. Since the + // StringMap iteration order isn't guaranteed, order by path string before + // assigning ids. + std::vector ModulePaths; + for (auto &[ModPath, _] : modulePaths()) + ModulePaths.push_back(ModPath); + llvm::sort(ModulePaths.begin(), ModulePaths.end()); + DenseMap ModuleIdMap; + for (auto &ModPath : ModulePaths) + ModuleIdMap[ModPath] = ModuleIdMap.size(); + // Get node identifier in form MXXX_. The MXXX prefix is required, // because we may have multiple linkonce functions summaries. auto NodeId = [](uint64_t ModId, GlobalValue::GUID Id) { @@ -589,7 +600,10 @@ OS << "digraph Summary {\n"; for (auto &ModIt : ModuleToDefinedGVS) { - auto ModId = getModuleId(ModIt.first); + // Will be empty for a just built per-module index, which doesn't setup a + // module paths table. In that case use 0 as the module id. + assert(ModuleIdMap.count(ModIt.first) || ModuleIdMap.empty()); + auto ModId = ModuleIdMap.empty() ? 0 : ModuleIdMap[ModIt.first]; OS << " // Module: " << ModIt.first << "\n"; OS << " subgraph cluster_" << std::to_string(ModId) << " {\n"; OS << " style = filled;\n"; diff --git a/llvm/lib/IRPrinter/IRPrintingPasses.cpp b/llvm/lib/IRPrinter/IRPrintingPasses.cpp --- a/llvm/lib/IRPrinter/IRPrintingPasses.cpp +++ b/llvm/lib/IRPrinter/IRPrintingPasses.cpp @@ -53,7 +53,7 @@ : nullptr; if (Index) { if (Index->modulePaths().empty()) - Index->addModule("", 0); + Index->addModule(""); Index->print(OS); } diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -183,7 +183,7 @@ return ModIt->second; } - const ModuleHash &getHash() const { return ModInfo->second.second; } + const ModuleHash &getHash() const { return ModInfo->second; } }; std::vector ImportModulesVector; @@ -778,7 +778,7 @@ // Regular LTO module summaries are added to a dummy module that represents // the combined regular LTO module. - if (Error Err = BM.readSummary(ThinLTO.CombinedIndex, "", -1ull)) + if (Error Err = BM.readSummary(ThinLTO.CombinedIndex, "")) return Err; RegularLTO.ModsWithSummaries.push_back(std::move(*ModOrErr)); return Error::success(); @@ -1026,16 +1026,14 @@ } } - uint64_t ModuleId = ThinLTO.ModuleMap.size(); if (Error Err = BM.readSummary(ThinLTO.CombinedIndex, BM.getModuleIdentifier(), - ModuleId, [&](GlobalValue::GUID GUID) { + [&](GlobalValue::GUID GUID) { return ThinLTO.PrevailingModuleForGUID[GUID] == BM.getModuleIdentifier(); })) return Err; - LLVM_DEBUG(dbgs() << "Module " << ModuleId << ": " << BM.getModuleIdentifier() - << "\n"); + LLVM_DEBUG(dbgs() << "Module " << BM.getModuleIdentifier() << "\n"); for (const InputFile::Symbol &Sym : Syms) { assert(ResI != ResE); diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -617,11 +617,9 @@ std::unique_ptr ThinLTOCodeGenerator::linkCombinedIndex() { std::unique_ptr CombinedIndex = std::make_unique(/*HaveGVs=*/false); - uint64_t NextModuleId = 0; for (auto &Mod : Modules) { auto &M = Mod->getSingleBitcodeModule(); - if (Error Err = - M.readSummary(*CombinedIndex, Mod->getName(), NextModuleId++)) { + if (Error Err = M.readSummary(*CombinedIndex, Mod->getName())) { // FIXME diagnose logAllUnhandledErrors( std::move(Err), errs(), diff --git a/llvm/test/Assembler/thinlto-multiple-summaries-for-guid.ll b/llvm/test/Assembler/thinlto-multiple-summaries-for-guid.ll --- a/llvm/test/Assembler/thinlto-multiple-summaries-for-guid.ll +++ b/llvm/test/Assembler/thinlto-multiple-summaries-for-guid.ll @@ -4,9 +4,9 @@ source_filename = "index.bc" -^0 = module: (path: "main.bc", hash: (3499594384, 1671013073, 3271036935, 1830411232, 59290952)) -; 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, 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))) +^0 = module: (path: "[Regular LTO]", hash: (0, 0, 0, 0, 0)) +; CHECK: ^0 = module: (path: "[Regular LTO]", hash: (0, 0, 0, 0, 0)) +^1 = module: (path: "main.bc", hash: (3499594384, 1671013073, 3271036935, 1830411232, 59290952)) +; CHECK-NEXT: ^1 = module: (path: "main.bc", hash: (3499594384, 1671013073, 3271036935, 1830411232, 59290952)) +^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^1, 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: ^1, 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))) diff --git a/llvm/test/ThinLTO/X86/dot-dumper-full-lto.ll b/llvm/test/ThinLTO/X86/dot-dumper-full-lto.ll --- a/llvm/test/ThinLTO/X86/dot-dumper-full-lto.ll +++ b/llvm/test/ThinLTO/X86/dot-dumper-full-lto.ll @@ -9,10 +9,10 @@ ; RUN: -r=%t2.bc,B,p ; RUN: cat %t3.index.dot | FileCheck %s -; CHECK: subgraph cluster_4294967295 -; CHECK: M4294967295_[[ID:[0-9]+]]{{.*}}main +; CHECK: subgraph cluster_0 +; CHECK: M0_[[ID:[0-9]+]]{{.*}}main ; CHECK: // Cross-module edges: -; CHECK: M4294967295_[[ID]] -> M0_{{[0-9]+}}{{.*}}// ref +; CHECK: M0_[[ID]] -> M1_{{[0-9]+}}{{.*}}// ref 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" diff --git a/llvm/tools/llvm-lto/llvm-lto.cpp b/llvm/tools/llvm-lto/llvm-lto.cpp --- a/llvm/tools/llvm-lto/llvm-lto.cpp +++ b/llvm/tools/llvm-lto/llvm-lto.cpp @@ -481,12 +481,11 @@ /// currently available via the gold plugin via -thinlto. static void createCombinedModuleSummaryIndex() { ModuleSummaryIndex CombinedIndex(/*HaveGVs=*/false); - uint64_t NextModuleId = 0; for (auto &Filename : InputFilenames) { ExitOnError ExitOnErr("llvm-lto: error loading file '" + Filename + "': "); std::unique_ptr MB = ExitOnErr(errorOrToExpected(MemoryBuffer::getFileOrSTDIN(Filename))); - ExitOnErr(readModuleSummaryIndex(*MB, CombinedIndex, NextModuleId++)); + ExitOnErr(readModuleSummaryIndex(*MB, CombinedIndex)); } // In order to use this index for testing, specifically import testing, we // need to update any indirect call edges created from SamplePGO, so that they