[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