diff options
author | Mingming Liu <mingmingl@google.com> | 2025-04-23 09:21:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-23 09:21:07 -0700 |
commit | 2f0cd0c68ef027f87f34f04141c083212fda2806 (patch) | |
tree | 33ce01e991a98db669255eb38b3064dd317ad732 /llvm/lib/ProfileData/InstrProfWriter.cpp | |
parent | 24c860547e8e595f8bf8d87b52544e2aff243f2e (diff) | |
download | llvm-2f0cd0c68ef027f87f34f04141c083212fda2806.zip llvm-2f0cd0c68ef027f87f34f04141c083212fda2806.tar.gz llvm-2f0cd0c68ef027f87f34f04141c083212fda2806.tar.bz2 |
[NFCI] Move ProfOStream from InstrProfWriter.cpp to InstrProf.h/cpp (#136791)
ProfOStream is a wrapper class for output stream, and used by
InstrProfWriter.cpp to serialize various profiles, like PGO profiles and
MemProf.
This change proposes to move it into InstrProf.h/cpp. After this is in,
InstrProfWriter can dispatch serialization of various formats into
methods like `obj->serialize()`, and the serialization code could be
move out of InstrProfWriter.cpp into individual classes (each in a
smaller cpp file). One example is that we can gradually move
writeMemprof [1] into llvm/*/ProfileData/MemProf.h/cpp, where a couple
of classes already have `serialize/deserialize` methods.
[1]
https://github.com/llvm/llvm-project/blob/85b35a90770b6053f91d79ca685cdfa4bf6499a4/llvm/lib/ProfileData/InstrProfWriter.cpp#L774-L791
Diffstat (limited to 'llvm/lib/ProfileData/InstrProfWriter.cpp')
-rw-r--r-- | llvm/lib/ProfileData/InstrProfWriter.cpp | 60 |
1 files changed, 0 insertions, 60 deletions
diff --git a/llvm/lib/ProfileData/InstrProfWriter.cpp b/llvm/lib/ProfileData/InstrProfWriter.cpp index 18aa76c..f1882dc 100644 --- a/llvm/lib/ProfileData/InstrProfWriter.cpp +++ b/llvm/lib/ProfileData/InstrProfWriter.cpp @@ -37,68 +37,8 @@ using namespace llvm; -// A struct to define how the data stream should be patched. For Indexed -// profiling, only uint64_t data type is needed. -struct PatchItem { - uint64_t Pos; // Where to patch. - ArrayRef<uint64_t> D; // An array of source data. -}; - namespace llvm { -// A wrapper class to abstract writer stream with support of bytes -// back patching. -class ProfOStream { -public: - ProfOStream(raw_fd_ostream &FD) - : IsFDOStream(true), OS(FD), LE(FD, llvm::endianness::little) {} - ProfOStream(raw_string_ostream &STR) - : IsFDOStream(false), OS(STR), LE(STR, llvm::endianness::little) {} - - [[nodiscard]] uint64_t tell() const { return OS.tell(); } - void write(uint64_t V) { LE.write<uint64_t>(V); } - void write32(uint32_t V) { LE.write<uint32_t>(V); } - void writeByte(uint8_t V) { LE.write<uint8_t>(V); } - - // \c patch can only be called when all data is written and flushed. - // For raw_string_ostream, the patch is done on the target string - // directly and it won't be reflected in the stream's internal buffer. - void patch(ArrayRef<PatchItem> P) { - using namespace support; - - if (IsFDOStream) { - raw_fd_ostream &FDOStream = static_cast<raw_fd_ostream &>(OS); - const uint64_t LastPos = FDOStream.tell(); - for (const auto &K : P) { - FDOStream.seek(K.Pos); - for (uint64_t Elem : K.D) - write(Elem); - } - // Reset the stream to the last position after patching so that users - // don't accidentally overwrite data. This makes it consistent with - // the string stream below which replaces the data directly. - FDOStream.seek(LastPos); - } else { - raw_string_ostream &SOStream = static_cast<raw_string_ostream &>(OS); - std::string &Data = SOStream.str(); // with flush - for (const auto &K : P) { - for (int I = 0, E = K.D.size(); I != E; I++) { - uint64_t Bytes = - endian::byte_swap<uint64_t, llvm::endianness::little>(K.D[I]); - Data.replace(K.Pos + I * sizeof(uint64_t), sizeof(uint64_t), - (const char *)&Bytes, sizeof(uint64_t)); - } - } - } - } - - // If \c OS is an instance of \c raw_fd_ostream, this field will be - // true. Otherwise, \c OS will be an raw_string_ostream. - bool IsFDOStream; - raw_ostream &OS; - support::endian::Writer LE; -}; - class InstrProfRecordWriterTrait { public: using key_type = StringRef; |