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 @@ -136,11 +136,16 @@ AddString(Conf.DefaultTriple); AddString(Conf.DwoDir); - // Include the hash for the current module - auto ModHash = Index.getModuleHash(ModuleID); - Hasher.update(ArrayRef((uint8_t *)&ModHash[0], sizeof(ModHash))); + std::vector ExportsGUID; + ExportsGUID.reserve(ExportList.size()); for (const auto &VI : ExportList) { auto GUID = VI.getGUID(); + ExportsGUID.push_back(GUID); + } + + // Sort the export list elements GUIDs. + llvm::sort(ExportsGUID); + for (uint64_t GUID : ExportsGUID) { // The export list can impact the internalization, be conservative here Hasher.update(ArrayRef((uint8_t *)&GUID, sizeof(GUID))); } @@ -148,12 +153,21 @@ // Include the hash for every module we import functions from. The set of // imported symbols for each module may affect code generation and is // sensitive to link order, so include that as well. - for (auto &Entry : ImportList) { - auto ModHash = Index.getModuleHash(Entry.first()); + using MapEntryTy = FunctionImporter::ImportMapTy::MapEntryTy; + std::vector ImportModulesVector; + ImportModulesVector.reserve(ImportList.size()); + for (const auto &Entry : ImportList) + ImportModulesVector.push_back(&Entry); + llvm::sort(ImportModulesVector, + [](const MapEntryTy *Lhs, const MapEntryTy *Rhs) { + return Lhs->getKey() < Rhs->getKey(); + }); + for (const MapEntryTy *Entry : ImportModulesVector) { + auto ModHash = Index.getModuleHash(Entry->first()); Hasher.update(ArrayRef((uint8_t *)&ModHash[0], sizeof(ModHash))); - AddUint64(Entry.second.size()); - for (auto &Fn : Entry.second) + AddUint64(Entry->second.size()); + for (auto &Fn : Entry->second) AddUint64(Fn); }