[llvm] [flang-rt] Split large unformatted sequential records into subrecords (PR #213003)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 30 04:58:12 PDT 2026


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,h -- flang-rt/lib/runtime/unit.cpp flang-rt/lib/runtime/unit.h flang-rt/unittests/Runtime/ExternalIOTest.cpp --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/flang-rt/lib/runtime/unit.cpp b/flang-rt/lib/runtime/unit.cpp
index ad8d29099..2223a2928 100644
--- a/flang-rt/lib/runtime/unit.cpp
+++ b/flang-rt/lib/runtime/unit.cpp
@@ -89,8 +89,8 @@ static RT_API_ATTRS void LayoutBufferedSubrecords(
     std::int32_t length{static_cast<std::int32_t>(chunk)};
     StoreRecordMarker(base + dst - kRecMarkSize,
         SignedRecordMarker(length, i + 1 < subrecords), swapEndianness);
-    StoreRecordMarker(base + dst + chunk,
-        SignedRecordMarker(length, i > 0), swapEndianness);
+    StoreRecordMarker(
+        base + dst + chunk, SignedRecordMarker(length, i > 0), swapEndianness);
   }
 }
 
@@ -190,8 +190,8 @@ bool ExternalFileUnit::Receive(char *data, std::size_t bytes,
       if (chunk > streamReadRemain_) {
         chunk = streamReadRemain_;
       }
-      auto logicalRemain{static_cast<std::size_t>(
-          *recordLength - positionInRecord)};
+      auto logicalRemain{
+          static_cast<std::size_t>(*recordLength - positionInRecord)};
       if (chunk > logicalRemain) {
         chunk = logicalRemain;
       }
@@ -419,11 +419,13 @@ bool ExternalFileUnit::AdvanceRecord(IoErrorHandler &handler) {
             static_cast<std::size_t>(furthestPositionInRecord - kRecMarkSize)};
         if (payload <= static_cast<std::size_t>(kMaxSubrecPayload)) {
           std::int32_t length{static_cast<std::int32_t>(payload)};
-          ok = ok && Emit(reinterpret_cast<const char *>(&length), kRecMarkSize,
-              kRecMarkSize, handler);
+          ok = ok &&
+              Emit(reinterpret_cast<const char *>(&length), kRecMarkSize,
+                  kRecMarkSize, handler);
           positionInRecord = 0;
-          ok = ok && Emit(reinterpret_cast<const char *>(&length), kRecMarkSize,
-              kRecMarkSize, handler);
+          ok = ok &&
+              Emit(reinterpret_cast<const char *>(&length), kRecMarkSize,
+                  kRecMarkSize, handler);
         } else {
           std::size_t maxChunk{static_cast<std::size_t>(kMaxSubrecPayload)};
           std::size_t subrecords{(payload + maxChunk - 1) / maxChunk};
@@ -676,9 +678,10 @@ void ExternalFileUnit::BeginSequentialVariableUnformattedInputRecord(
     return MarkerRead::Ok;
   };
 
-  auto scanRecord = [&](bool swap, std::int32_t &outHeader, std::int32_t &outFooter,
-      std::int32_t &outFirstHeader, std::size_t &outTotalPayload,
-      FileOffset &outFilePos) -> ScanOutcome {
+  auto scanRecord = [&](bool swap, std::int32_t &outHeader,
+                        std::int32_t &outFooter, std::int32_t &outFirstHeader,
+                        std::size_t &outTotalPayload,
+                        FileOffset &outFilePos) -> ScanOutcome {
     scanError = nullptr;
     outFilePos = recordStart;
     outTotalPayload = 0;
@@ -697,53 +700,59 @@ void ExternalFileUnit::BeginSequentialVariableUnformattedInputRecord(
       outTotalPayload += SubrecordPayloadBytes(outHeader);
       outFilePos += static_cast<FileOffset>(SubrecordPayloadBytes(outHeader));
       if (readMarkerAt(outFilePos, outFooter, swap) != MarkerRead::Ok) {
-        scanError = "Unformatted variable-length sequential file input failed at "
-                    "record #%jd (file offset %jd): truncated record footer";
+        scanError =
+            "Unformatted variable-length sequential file input failed at "
+            "record #%jd (file offset %jd): truncated record footer";
         return ScanOutcome::Fail;
       }
-      if (SubrecordPayloadBytes(outFooter) != SubrecordPayloadBytes(outHeader)) {
-        scanError = "Unformatted variable-length sequential file input failed at "
-                    "record #%jd (file offset %jd): record header has length %jd "
-                    "that does not match record footer (%jd)";
+      if (SubrecordPayloadBytes(outFooter) !=
+          SubrecordPayloadBytes(outHeader)) {
+        scanError =
+            "Unformatted variable-length sequential file input failed at "
+            "record #%jd (file offset %jd): record header has length %jd "
+            "that does not match record footer (%jd)";
         return ScanOutcome::Fail;
       }
       if (outHeader >= 0) {
         return ScanOutcome::Ok;
       }
       if (readMarkerAt(outFilePos, outHeader, swap) != MarkerRead::Ok) {
-        scanError = "Unformatted variable-length sequential file input failed at "
-                    "record #%jd (file offset %jd): truncated record header";
+        scanError =
+            "Unformatted variable-length sequential file input failed at "
+            "record #%jd (file offset %jd): truncated record header";
         return ScanOutcome::Fail;
       }
     } while (true);
   };
 
-  auto outcome{scanRecord(swapEndianness_, header, footer, firstHeader,
-      totalPayload, filePos)};
+  auto outcome{scanRecord(
+      swapEndianness_, header, footer, firstHeader, totalPayload, filePos)};
   if (outcome == ScanOutcome::Eof) {
     HitEndOnRead(handler);
     return;
   }
   if (outcome == ScanOutcome::Fail) {
     const char *primaryError{scanError};
-    if (frameOffsetInFile_ == 0 && recordOffsetInFrame_ == 0 &&
-        [&]() {
-          std::int32_t swappedHeader{0}, swappedFooter{0}, swappedFirstHeader{0};
+    if (frameOffsetInFile_ == 0 && recordOffsetInFrame_ == 0 && [&]() {
+          std::int32_t swappedHeader{0}, swappedFooter{0},
+              swappedFirstHeader{0};
           std::size_t swappedTotalPayload{0};
           FileOffset swappedFilePos{recordStart};
           return scanRecord(!swapEndianness_, swappedHeader, swappedFooter,
-                     swappedFirstHeader, swappedTotalPayload, swappedFilePos) ==
-              ScanOutcome::Ok;
+                     swappedFirstHeader, swappedTotalPayload,
+                     swappedFilePos) == ScanOutcome::Ok;
         }()) {
-      error = "Unformatted variable-length sequential file input failed on the "
-              "first record, probably due to a need for byte order data "
-              "conversion; consider adding CONVERT='SWAP' to the OPEN statement "
-              "or adding FORT_CONVERT=SWAP to the execution environment";
+      error =
+          "Unformatted variable-length sequential file input failed on the "
+          "first record, probably due to a need for byte order data "
+          "conversion; consider adding CONVERT='SWAP' to the OPEN statement "
+          "or adding FORT_CONVERT=SWAP to the execution environment";
     } else {
-      error = primaryError ? primaryError
-                           : "Unformatted variable-length sequential file input "
-                             "failed at record #%jd (file offset %jd): truncated "
-                             "record header";
+      error = primaryError
+          ? primaryError
+          : "Unformatted variable-length sequential file input "
+            "failed at record #%jd (file offset %jd): truncated "
+            "record header";
     }
   } else {
     auto diskBytes{filePos - recordStart};
@@ -832,7 +841,8 @@ void ExternalFileUnit::BackspaceVariableUnformattedRecord(
     }
     frameOffsetInFile_ -= static_cast<FileOffset>(payload + 2 * kRecMarkSize);
   } while (marker < 0);
-  auto need{static_cast<std::size_t>(kRecMarkSize + SubrecordPayloadBytes(marker))};
+  auto need{
+      static_cast<std::size_t>(kRecMarkSize + SubrecordPayloadBytes(marker))};
   if (ReadFrame(frameOffsetInFile_, need, handler) < need) {
     handler.SignalError(IostatShortRead);
     return;
diff --git a/flang-rt/unittests/Runtime/ExternalIOTest.cpp b/flang-rt/unittests/Runtime/ExternalIOTest.cpp
index 56283f338..2b80cfcfe 100644
--- a/flang-rt/unittests/Runtime/ExternalIOTest.cpp
+++ b/flang-rt/unittests/Runtime/ExternalIOTest.cpp
@@ -373,11 +373,13 @@ TEST(ExternalIOTests, TestSequentialUnformattedSubrecords) {
   Cookie io{IONAME(BeginOpenUnit)(unit, __FILE__, __LINE__)};
   ASSERT_TRUE(IONAME(SetFile)(io, fileName, std::strlen(fileName)))
       << "SetFile()";
-  ASSERT_TRUE(IONAME(SetAccess)(io, "SEQUENTIAL", 10)) << "SetAccess(SEQUENTIAL)";
+  ASSERT_TRUE(IONAME(SetAccess)(io, "SEQUENTIAL", 10))
+      << "SetAccess(SEQUENTIAL)";
   ASSERT_TRUE(IONAME(SetAction)(io, "READ", 4)) << "SetAction(READ)";
   ASSERT_TRUE(IONAME(SetForm)(io, "UNFORMATTED", 11)) << "SetForm(UNFORMATTED)";
   ASSERT_TRUE(IONAME(SetStatus)(io, "OLD", 3)) << "SetStatus(OLD)";
-  ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk) << "EndIoStatement() for OPEN";
+  ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
+      << "EndIoStatement() for OPEN";
 
   StaticDescriptor<0> staticDescriptor;
   Descriptor &desc{staticDescriptor.descriptor()};
@@ -387,7 +389,8 @@ TEST(ExternalIOTests, TestSequentialUnformattedSubrecords) {
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
     desc.Establish(TypeCode{sizeof buffer[0]}, sizeof buffer, buffer, 0);
     desc.Check();
-    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc)) << "InputDescriptor() " << what;
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() " << what;
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
         << "EndIoStatement() for READ record #1 " << what;
     for (int k{0}; k < 6; ++k) {
@@ -402,7 +405,8 @@ TEST(ExternalIOTests, TestSequentialUnformattedSubrecords) {
     io = IONAME(BeginUnformattedInput)(unit, __FILE__, __LINE__);
     desc.Establish(TypeCode{sizeof value}, sizeof value, &value, 0);
     desc.Check();
-    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc)) << "InputDescriptor() " << what;
+    ASSERT_TRUE(IONAME(InputDescriptor)(io, desc))
+        << "InputDescriptor() " << what;
     ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
         << "EndIoStatement() for READ record #2 " << what;
     ASSERT_EQ(value, kRecord2) << "record #2 " << what << " read back " << value
@@ -428,7 +432,8 @@ TEST(ExternalIOTests, TestSequentialUnformattedSubrecords) {
   // CLOSE(UNIT=unit,STATUS='DELETE')
   io = IONAME(BeginClose)(unit, __FILE__, __LINE__);
   ASSERT_TRUE(IONAME(SetStatus)(io, "DELETE", 6)) << "SetStatus(DELETE)";
-  ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk) << "EndIoStatement() for Close";
+  ASSERT_EQ(IONAME(EndIoStatement)(io), IostatOk)
+      << "EndIoStatement() for Close";
 }
 
 TEST(ExternalIOTests, TestDirectFormatted) {

``````````

</details>


https://github.com/llvm/llvm-project/pull/213003


More information about the llvm-commits mailing list