diff options
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm/ProfileData/DataAccessProf.h | 12 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/IndexedMemProfData.h | 12 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/InstrProfReader.h | 6 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/InstrProfWriter.h | 6 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/MemProfReader.h | 15 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/MemProfYAML.h | 65 |
6 files changed, 109 insertions, 7 deletions
diff --git a/llvm/include/llvm/ProfileData/DataAccessProf.h b/llvm/include/llvm/ProfileData/DataAccessProf.h index e850410..f5f6abf0 100644 --- a/llvm/include/llvm/ProfileData/DataAccessProf.h +++ b/llvm/include/llvm/ProfileData/DataAccessProf.h @@ -41,6 +41,8 @@ namespace data_access_prof { struct SourceLocation { SourceLocation(StringRef FileNameRef, uint32_t Line) : FileName(FileNameRef.str()), Line(Line) {} + + SourceLocation() {} /// The filename where the data is located. std::string FileName; /// The line number in the source code. @@ -53,6 +55,8 @@ namespace internal { // which strings are owned by `DataAccessProfData`. Used by `DataAccessProfData` // to represent data locations internally. struct SourceLocationRef { + SourceLocationRef(StringRef FileNameRef, uint32_t Line) + : FileName(FileNameRef), Line(Line) {} // The filename where the data is located. StringRef FileName; // The line number in the source code. @@ -100,8 +104,9 @@ using SymbolHandle = std::variant<std::string, uint64_t>; /// The data access profiles for a symbol. struct DataAccessProfRecord { public: - DataAccessProfRecord(SymbolHandleRef SymHandleRef, - ArrayRef<internal::SourceLocationRef> LocRefs) { + DataAccessProfRecord(SymbolHandleRef SymHandleRef, uint64_t AccessCount, + ArrayRef<internal::SourceLocationRef> LocRefs) + : AccessCount(AccessCount) { if (std::holds_alternative<StringRef>(SymHandleRef)) { SymHandle = std::get<StringRef>(SymHandleRef).str(); } else @@ -110,8 +115,9 @@ public: for (auto Loc : LocRefs) Locations.push_back(SourceLocation(Loc.FileName, Loc.Line)); } + DataAccessProfRecord() {} SymbolHandle SymHandle; - + uint64_t AccessCount; // The locations of data in the source code. Optional. SmallVector<SourceLocation> Locations; }; diff --git a/llvm/include/llvm/ProfileData/IndexedMemProfData.h b/llvm/include/llvm/ProfileData/IndexedMemProfData.h index 3c6c329..66fa384 100644 --- a/llvm/include/llvm/ProfileData/IndexedMemProfData.h +++ b/llvm/include/llvm/ProfileData/IndexedMemProfData.h @@ -10,14 +10,20 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ProfileData/DataAccessProf.h" #include "llvm/ProfileData/InstrProf.h" #include "llvm/ProfileData/MemProf.h" +#include <functional> +#include <optional> + namespace llvm { // Write the MemProf data to OS. -Error writeMemProf(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, - memprof::IndexedVersion MemProfVersionRequested, - bool MemProfFullSchema); +Error writeMemProf( + ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, + memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema, + std::optional<std::reference_wrapper<data_access_prof::DataAccessProfData>> + DataAccessProfileData); } // namespace llvm diff --git a/llvm/include/llvm/ProfileData/InstrProfReader.h b/llvm/include/llvm/ProfileData/InstrProfReader.h index c250a9e..210df6b 100644 --- a/llvm/include/llvm/ProfileData/InstrProfReader.h +++ b/llvm/include/llvm/ProfileData/InstrProfReader.h @@ -18,6 +18,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/IR/ProfileSummary.h" #include "llvm/Object/BuildID.h" +#include "llvm/ProfileData/DataAccessProf.h" #include "llvm/ProfileData/InstrProf.h" #include "llvm/ProfileData/InstrProfCorrelator.h" #include "llvm/ProfileData/MemProf.h" @@ -704,9 +705,12 @@ private: // The number of elements in the radix tree array. unsigned RadixTreeSize = 0; + std::unique_ptr<data_access_prof::DataAccessProfData> DataAccessProfileData; + Error deserializeV2(const unsigned char *Start, const unsigned char *Ptr); Error deserializeRadixTreeBased(const unsigned char *Start, - const unsigned char *Ptr); + const unsigned char *Ptr, + memprof::IndexedVersion Version); public: IndexedMemProfReader() = default; diff --git a/llvm/include/llvm/ProfileData/InstrProfWriter.h b/llvm/include/llvm/ProfileData/InstrProfWriter.h index 67d85da..cf1cec2 100644 --- a/llvm/include/llvm/ProfileData/InstrProfWriter.h +++ b/llvm/include/llvm/ProfileData/InstrProfWriter.h @@ -19,6 +19,7 @@ #include "llvm/ADT/StringMap.h" #include "llvm/IR/GlobalValue.h" #include "llvm/Object/BuildID.h" +#include "llvm/ProfileData/DataAccessProf.h" #include "llvm/ProfileData/InstrProf.h" #include "llvm/ProfileData/MemProf.h" #include "llvm/Support/Error.h" @@ -81,6 +82,8 @@ private: // Whether to generated random memprof hotness for testing. bool MemprofGenerateRandomHotness; + std::unique_ptr<data_access_prof::DataAccessProfData> DataAccessProfileData; + public: // For memprof testing, random hotness can be assigned to the contexts if // MemprofGenerateRandomHotness is enabled. The random seed can be either @@ -122,6 +125,9 @@ public: // Add a binary id to the binary ids list. void addBinaryIds(ArrayRef<llvm::object::BuildID> BIs); + void addDataAccessProfData( + std::unique_ptr<data_access_prof::DataAccessProfData> DataAccessProfile); + /// Merge existing function counts from the given writer. void mergeRecordsFromWriter(InstrProfWriter &&IPW, function_ref<void(Error)> Warn); diff --git a/llvm/include/llvm/ProfileData/MemProfReader.h b/llvm/include/llvm/ProfileData/MemProfReader.h index 29d9e57..02defa1 100644 --- a/llvm/include/llvm/ProfileData/MemProfReader.h +++ b/llvm/include/llvm/ProfileData/MemProfReader.h @@ -228,6 +228,21 @@ public: create(std::unique_ptr<MemoryBuffer> Buffer); void parse(StringRef YAMLData); + + std::unique_ptr<data_access_prof::DataAccessProfData> + takeDataAccessProfData() { + return std::move(DataAccessProfileData); + } + +private: + // Called by `parse` to set data access profiles after parsing them from Yaml + // files. + void setDataAccessProfileData( + std::unique_ptr<data_access_prof::DataAccessProfData> Data) { + DataAccessProfileData = std::move(Data); + } + + std::unique_ptr<data_access_prof::DataAccessProfData> DataAccessProfileData; }; } // namespace memprof } // namespace llvm diff --git a/llvm/include/llvm/ProfileData/MemProfYAML.h b/llvm/include/llvm/ProfileData/MemProfYAML.h index 08dee25..8db73f4 100644 --- a/llvm/include/llvm/ProfileData/MemProfYAML.h +++ b/llvm/include/llvm/ProfileData/MemProfYAML.h @@ -2,6 +2,7 @@ #define LLVM_PROFILEDATA_MEMPROFYAML_H_ #include "llvm/ADT/SmallVector.h" +#include "llvm/ProfileData/DataAccessProf.h" #include "llvm/ProfileData/MemProf.h" #include "llvm/Support/Format.h" #include "llvm/Support/YAMLTraits.h" @@ -12,6 +13,9 @@ namespace memprof { // serialized and deserialized in YAML. LLVM_YAML_STRONG_TYPEDEF(uint64_t, GUIDHex64) +LLVM_YAML_STRONG_TYPEDEF(uint64_t, SymbolContentHash) +LLVM_YAML_STRONG_TYPEDEF(std::string, OwnedSymbolName) + // Helper struct for AllMemProfData. In YAML, we treat the GUID and the fields // within MemProfRecord at the same level as if the GUID were part of // MemProfRecord. @@ -20,9 +24,25 @@ struct GUIDMemProfRecordPair { MemProfRecord Record; }; +// Helper struct to yamlify data_access_prof::DataAccessProfData. The struct +// members use owned strings. This is for simplicity and assumes that most real +// world use cases do look-ups and regression test scale is small, so string +// efficiency is not a priority. +struct YamlDataAccessProfData { + std::vector<data_access_prof::DataAccessProfRecord> Records; + std::vector<uint64_t> KnownColdHashes; + std::vector<std::string> KnownColdSymbols; + + bool isEmpty() const { + return Records.empty() && KnownColdHashes.empty() && + KnownColdSymbols.empty(); + } +}; + // The top-level data structure, only used with YAML for now. struct AllMemProfData { std::vector<GUIDMemProfRecordPair> HeapProfileRecords; + YamlDataAccessProfData YamlifiedDataAccessProfiles; }; } // namespace memprof @@ -206,9 +226,50 @@ template <> struct MappingTraits<memprof::GUIDMemProfRecordPair> { } }; +template <> struct MappingTraits<data_access_prof::SourceLocation> { + static void mapping(IO &Io, data_access_prof::SourceLocation &Loc) { + Io.mapOptional("FileName", Loc.FileName); + Io.mapOptional("Line", Loc.Line); + } +}; + +template <> struct MappingTraits<data_access_prof::DataAccessProfRecord> { + static void mapping(IO &Io, data_access_prof::DataAccessProfRecord &Rec) { + if (Io.outputting()) { + if (std::holds_alternative<std::string>(Rec.SymHandle)) { + Io.mapOptional("Symbol", std::get<std::string>(Rec.SymHandle)); + } else { + Io.mapOptional("Hash", std::get<uint64_t>(Rec.SymHandle)); + } + } else { + std::string SymName; + uint64_t Hash = 0; + Io.mapOptional("Symbol", SymName); + Io.mapOptional("Hash", Hash); + if (!SymName.empty()) { + Rec.SymHandle = SymName; + } else { + Rec.SymHandle = Hash; + } + } + + Io.mapOptional("Locations", Rec.Locations); + } +}; + +template <> struct MappingTraits<memprof::YamlDataAccessProfData> { + static void mapping(IO &Io, memprof::YamlDataAccessProfData &Data) { + Io.mapOptional("SampledRecords", Data.Records); + Io.mapOptional("KnownColdSymbols", Data.KnownColdSymbols); + Io.mapOptional("KnownColdHashes", Data.KnownColdHashes); + } +}; + template <> struct MappingTraits<memprof::AllMemProfData> { static void mapping(IO &Io, memprof::AllMemProfData &Data) { Io.mapRequired("HeapProfileRecords", Data.HeapProfileRecords); + + Io.mapOptional("DataAccessProfiles", Data.YamlifiedDataAccessProfiles); } }; @@ -234,5 +295,9 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(memprof::AllocationInfo) LLVM_YAML_IS_SEQUENCE_VECTOR(memprof::CallSiteInfo) LLVM_YAML_IS_SEQUENCE_VECTOR(memprof::GUIDMemProfRecordPair) LLVM_YAML_IS_SEQUENCE_VECTOR(memprof::GUIDHex64) // Used for CalleeGuids +LLVM_YAML_IS_SEQUENCE_VECTOR(data_access_prof::DataAccessProfRecord) +LLVM_YAML_IS_SEQUENCE_VECTOR(data_access_prof::SourceLocation) +LLVM_YAML_IS_SEQUENCE_VECTOR(memprof::SymbolContentHash) +LLVM_YAML_IS_SEQUENCE_VECTOR(memprof::OwnedSymbolName) #endif // LLVM_PROFILEDATA_MEMPROFYAML_H_ |