[llvm] Unittests and usability for BitstreamWriter incremental flushing (PR #92983)
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Wed May 29 12:19:34 PDT 2024
================
@@ -77,47 +86,106 @@ class BitstreamWriter {
void WriteWord(unsigned Value) {
Value =
support::endian::byte_swap<uint32_t, llvm::endianness::little>(Value);
- Out.append(reinterpret_cast<const char *>(&Value),
- reinterpret_cast<const char *>(&Value + 1));
+ Buffer.append(reinterpret_cast<const char *>(&Value),
+ reinterpret_cast<const char *>(&Value + 1));
}
- uint64_t GetNumOfFlushedBytes() const { return FS ? FS->tell() : 0; }
+ uint64_t GetNumOfFlushedBytes() const {
+ return fdStream() ? fdStream()->tell() : 0;
+ }
- size_t GetBufferOffset() const { return Out.size() + GetNumOfFlushedBytes(); }
+ size_t GetBufferOffset() const {
+ return Buffer.size() + GetNumOfFlushedBytes();
+ }
size_t GetWordIndex() const {
size_t Offset = GetBufferOffset();
assert((Offset & 3) == 0 && "Not 32-bit aligned");
return Offset / 4;
}
- /// If the related file stream supports reading, seeking and writing, flush
- /// the buffer if its size is above a threshold.
- void FlushToFile() {
- if (!FS)
+ void flushAndClear() {
+ assert(FS);
+ assert(!Buffer.empty());
+ assert(!BlockFlushingStartPos &&
+ "a call to markAndBlockFlushing should have been paired with a "
+ "call to getMarkedBufferAndResumeFlushing");
+ FS->write(Buffer.data(), Buffer.size());
+ Buffer.clear();
+ }
+
+ /// If the related file stream is a raw_fd_stream, flush the buffer if its
+ /// size is above a threshold. If \p OnClosing is true, flushing happens
+ /// regardless of thresholds.
+ void FlushToFile(bool OnClosing = false) {
+ if (!FS || Buffer.empty())
return;
- if (Out.size() < FlushThreshold)
+ if (OnClosing)
+ return flushAndClear();
----------------
teresajohnson wrote:
What prevents this from being called when FS==nullptr, which will cause an assert in flushAndClear()?
https://github.com/llvm/llvm-project/pull/92983
More information about the llvm-commits
mailing list