[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