[flang-commits] [flang] [llvm] [flang-rt] Split large unformatted sequential records into subrecords (PR #213003)
via flang-commits
flang-commits at lists.llvm.org
Fri Oct 16 03:16:12 PDT 2026
================
@@ -173,6 +228,46 @@ bool ExternalFileUnit::Receive(char *data, std::size_t bytes,
static_cast<std::intmax_t>(*recordLength));
return false;
}
+ if (streamRead_) {
+ std::size_t copied{0};
+ while (copied < bytes) {
+ if (streamReadRemain_ == 0) {
+ streamReadPos_ += kRecMarkSize;
+ char mark[kRecMarkSize];
+ if (Read(streamReadPos_, mark, kRecMarkSize, kRecMarkSize, handler) <
+ kRecMarkSize) {
+ HitEndOnRead(handler);
+ return false;
+ }
+ streamReadPos_ += kRecMarkSize;
+ streamReadRemain_ =
+ SubrecordPayloadBytes(LoadRecordMarker(mark, swapEndianness_));
+ }
+ std::size_t chunk{bytes - copied};
+ if (chunk > streamReadRemain_) {
+ chunk = streamReadRemain_;
+ }
+ auto logicalRemain{
+ static_cast<std::size_t>(*recordLength - positionInRecord)};
+ if (chunk > logicalRemain) {
+ chunk = logicalRemain;
+ }
+ if (Read(streamReadPos_, data + copied, chunk, chunk, handler) < chunk) {
----------------
ejose02 wrote:
Fixed: chunked ReadFrame/Read plus one swap over the buffer, not one read() per element.
https://github.com/llvm/llvm-project/pull/213003
More information about the flang-commits
mailing list