summaryrefslogtreecommitdiff
path: root/llvm/lib/ProfileData/DataAccessProf.cpp
diff options
context:
space:
mode:
authormingmingl <mingmingl@google.com>2025-04-21 01:18:08 +0000
committermingmingl <mingmingl@google.com>2025-04-22 00:21:36 +0000
commitc58294d37eabc70586b93b288bebed5f6871a60c (patch)
tree019d00d7fa2bc431312ca6d674131d32043779f3 /llvm/lib/ProfileData/DataAccessProf.cpp
parent3215fd70294369b73b0e944238097a28550e7435 (diff)
Profile format change for symbolized data access profilesusers/mingmingl-llvm/spr/symbolized-data-access-profile-format
Next: 1) write llvm-unit unit test 2) how memprof de-serialization finds the offset
Diffstat (limited to 'llvm/lib/ProfileData/DataAccessProf.cpp')
-rw-r--r--llvm/lib/ProfileData/DataAccessProf.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/llvm/lib/ProfileData/DataAccessProf.cpp b/llvm/lib/ProfileData/DataAccessProf.cpp
new file mode 100644
index 000000000000..1fa88457a966
--- /dev/null
+++ b/llvm/lib/ProfileData/DataAccessProf.cpp
@@ -0,0 +1,111 @@
+#include "llvm/ProfileData/DataAccessProf.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ProfileData/InstrProf.h"
+#include "llvm/Support/Endian.h"
+
+namespace llvm {
+
+uint64_t
+DataAccessProfData::addStringRef(StringRef Str,
+ llvm::MapVector<StringRef, uint64_t> &Map) {
+ auto [Iter, Inserted] = Map.insert({Str, Map.size()});
+ return Iter->second;
+}
+
+uint64_t DataAccessProfData::addSymbolName(StringRef SymbolName) {
+ return addStringRef(SymbolName, SymbolNames);
+}
+uint64_t DataAccessProfData::addFileName(StringRef FileName) {
+ return addStringRef(FileName, FileNames);
+}
+
+DataAccessProfRecord &DataAccessProfData::addRecord(uint64_t SymbolNameIndex,
+ uint64_t StringContentHash,
+ uint64_t AccessCount) {
+ Records.push_back({SymbolNameIndex, StringContentHash, AccessCount});
+ return Records.back();
+}
+
+SmallVector<StringRef> DataAccessProfData::getSymbolNames() const {
+ return llvm::to_vector(llvm::map_range(
+ SymbolNames, [](const auto &Pair) { return Pair.first; }));
+}
+
+SmallVector<StringRef> DataAccessProfData::getFileNames() const {
+ return llvm::to_vector(
+ llvm::map_range(FileNames, [](const auto &Pair) { return Pair.first; }));
+}
+
+Error DataAccessProfData::deserialize(const unsigned char *&Ptr) {
+ if (Error E = deserializeSymbolNames(Ptr))
+ return E;
+ if (Error E = deserializeFileNames(Ptr))
+ return E;
+ if (Error E = deserializeRecords(Ptr))
+ return E;
+ return Error::success();
+}
+
+Error DataAccessProfData::deserializeSymbolNames(const unsigned char *&Ptr) {
+ uint64_t SymbolNameLen =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+
+ StringRef MaybeCompressedSymbolNames((const char *)Ptr, SymbolNameLen);
+
+ std::function<Error(StringRef)> addSymbolName = [this](StringRef SymbolName) {
+ this->addSymbolName(SymbolName);
+ return Error::success();
+ };
+ if (Error E = readAndDecodeStrings(MaybeCompressedSymbolNames, addSymbolName))
+ return E;
+
+ Ptr += alignTo(SymbolNameLen, 8);
+ return Error::success();
+}
+
+Error DataAccessProfData::deserializeFileNames(const unsigned char *&Ptr) {
+ uint64_t FileNameLen =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+
+ StringRef MaybeCompressedFileNames((const char *)Ptr, FileNameLen);
+
+ std::function<Error(StringRef)> addFileName = [this](StringRef FileName) {
+ this->addFileName(FileName);
+ return Error::success();
+ };
+ if (Error E = readAndDecodeStrings(MaybeCompressedFileNames, addFileName))
+ return E;
+
+ Ptr += alignTo(FileNameLen, 8);
+ return Error::success();
+}
+
+Error DataAccessProfData::deserializeRecords(const unsigned char *&Ptr) {
+ uint64_t NumRecords =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+ Records.reserve(NumRecords);
+ for (uint64_t I = 0; I < NumRecords; ++I) {
+ uint64_t SymbolNameIndex =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+ uint64_t StringContentHash =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+ uint64_t AccessCount =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+
+ DataAccessProfRecord &Record =
+ addRecord(SymbolNameIndex, StringContentHash, AccessCount);
+
+ uint64_t NumLocations =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+ Record.Locations.reserve(NumLocations);
+ for (uint64_t J = 0; J < NumLocations; ++J) {
+ uint64_t FileNameIndex =
+ support::endian::readNext<uint64_t, llvm::endianness::little>(Ptr);
+ uint32_t Line =
+ support::endian::readNext<uint32_t, llvm::endianness::little>(Ptr);
+ Record.Locations.push_back({FileNameIndex, Line});
+ }
+ }
+ return Error::success();
+}
+} // namespace llvm