[llvm] [CFI][ThinLTO] Remove the need for CFI calculating ThinLTO GUIDs (PR #201370)
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 3 18:08:11 PDT 2026
================
@@ -1317,72 +1319,75 @@ struct TypeIdSummary {
std::map<uint64_t, WholeProgramDevirtResolution> WPDRes;
};
+/// Encapsulate the names of CFI target functions. It interfaces with ThinLTO to
+/// determine efficiently which of the names need to be exported for a
+/// particular module.
class CfiFunctionIndex {
- DenseMap<GlobalValue::GUID, std::set<std::string, std::less<>>> Index;
- using IndexIterator =
- DenseMap<GlobalValue::GUID,
- std::set<std::string, std::less<>>>::const_iterator;
- using NestedIterator = std::set<std::string, std::less<>>::const_iterator;
+ // `Names` is the authoritative source of data. `ThinLTOToNamesIndex` is there
+ // just to efficiently retrieve which names in this index need exporting for
+ // a particular module index. We cannot guarantee the ThinLTO GUIDs are
+ // collision - free, so we associate a collection to a guid. Functions with
+ // the same name may have different GUIDs, too. So we index a list of names
+ // with the same GUID under that GUID key. We don't need the reverse because
+ // the queries from ThinLTO use GUIDs as key.
+ // Note that StringSet rehashing doesn't move keys, so we can safely store the
+ // StringRef value inserted in `Names` in ThinLTOToNamesIndex, and avoid
+ // copies.
+ // Design note: we could do away with Names and use ThinLTOToNamesIndex as
+ // index and data source, but opted against, for a small heap penalty, to
+ // avoid confusion wrt the role GUIDs play in this case: they are an artifact
+ // of the need to interface with ThinLTO, not otherwise necessary to CFI.
+ StringSet<> Names;
----------------
vitalybuka wrote:
we probably want to delete copy constructor as ThinLTOToNamesIndex points in the self set?
https://github.com/llvm/llvm-project/pull/201370
More information about the llvm-commits
mailing list