================ @@ -96,13 +97,39 @@ bool MultilibSet::select(const Multilib::flags_list &Flags, llvm::SmallVector<Multilib> &Selected) const { llvm::StringSet<> FlagSet(expandFlags(Flags)); Selected.clear(); - llvm::copy_if(Multilibs, std::back_inserter(Selected), - [&FlagSet](const Multilib &M) { - for (const std::string &F : M.flags()) - if (!FlagSet.contains(F)) - return false; - return true; - }); + + // Decide which multilibs we're going to select at all + std::vector<bool> IsSelected(Multilibs.size(), false); + std::map<std::string, size_t> ExclusiveGroupMembers; + for (size_t i = 0, e = Multilibs.size(); i < e; ++i) { + const Multilib &M = Multilibs[i]; + + // If this multilib doesn't match all our flags, don't select it + if (!llvm::all_of(M.flags(), [&FlagSet](const std::string &F) { + return FlagSet.contains(F); + })) + continue; + + // If this multilib has the same ExclusiveGroup as one we've already + // selected, de-select the previous one + const std::string &group = M.exclusiveGroup(); + if (!group.empty()) { ---------------- MaskRay wrote:
Thanks for the update, but the new code still has the duplicate hash table lookup/insert problem, which can be fixed by using try_emplace. https://github.com/llvm/llvm-project/pull/69447 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits