[llvm] a0a4273 - [NFC][llvm][object][GOFF] cleanup GOFFObjectTests (#212286)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 5 08:37:40 PDT 2026
Author: David Tenty
Date: 2026-08-05T15:37:34Z
New Revision: a0a4273f0728b88a845ff3e751fdbbc457724ebd
URL: https://github.com/llvm/llvm-project/commit/a0a4273f0728b88a845ff3e751fdbbc457724ebd
DIFF: https://github.com/llvm/llvm-project/commit/a0a4273f0728b88a845ff3e751fdbbc457724ebd.diff
LOG: [NFC][llvm][object][GOFF] cleanup GOFFObjectTests (#212286)
This change cleans up the GOFF object file reading unit test based on
suggestions from #211632, and a few minor fixes for other issues
identified
Namely these are:
1. Remove global data from the test, making all data local to the test
being run
2. Fix erroneous reference to XCOFF rather than GOFF
3. Use vector rather statically size arrays for the test data
4. Use helpers to construct the data for repeated record types (we leave
trivial and one off cases as-is)
5. Swap uses of dyn_cast for static_cast
Assisted by: IBM Bob 2.0.1
---------
Co-authored-by: James Henderson <James.Henderson at sony.com>
Added:
Modified:
llvm/unittests/Object/GOFFObjectFileTest.cpp
Removed:
################################################################################
diff --git a/llvm/unittests/Object/GOFFObjectFileTest.cpp b/llvm/unittests/Object/GOFFObjectFileTest.cpp
index 8dc45337dc93b..09fa1c2f63938 100644
--- a/llvm/unittests/Object/GOFFObjectFileTest.cpp
+++ b/llvm/unittests/Object/GOFFObjectFileTest.cpp
@@ -17,10 +17,8 @@ using namespace llvm::object;
using namespace llvm::GOFF;
namespace {
-char GOFFData[GOFF::RecordLength * 3] = {0x00};
-
-void constructValidGOFF(size_t Size) {
- StringRef ValidSize(GOFFData, Size);
+void constructValidGOFF(const char *Data, size_t Size) {
+ StringRef ValidSize(Data, Size);
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
MemoryBufferRef(ValidSize, "dummyGOFF"));
@@ -28,9 +26,9 @@ void constructValidGOFF(size_t Size) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
}
-void constructInvalidGOFF(size_t Size) {
+void constructInvalidGOFF(const char *Data, size_t Size) {
// Construct GOFFObject with record of length != multiple of 80.
- StringRef InvalidData(GOFFData, Size);
+ StringRef InvalidData(Data, Size);
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
MemoryBufferRef(InvalidData, "dummyGOFF"));
@@ -41,10 +39,85 @@ void constructInvalidGOFF(size_t Size) {
"of 80 bytes, but is " +
std::to_string(Size) + " bytes"));
}
+
+class GOFFObjectFileTest : public ::testing::Test {
+protected:
+ std::vector<char> GOFFData;
+ uint8_t RecordCount = 0;
+
+ size_t addNewRecord() {
+ size_t Pos = GOFFData.size();
+ GOFFData.resize(Pos + GOFF::RecordLength);
+ ++RecordCount;
+ return Pos;
+ }
+
+ void addEndRecord() {
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x40; // END record, non-continued.
+ GOFFData[Pos + 11] = (char)RecordCount;
+ }
+
+ void addHdrRecord(uint8_t ArchLevel = 0) {
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0xF0; // HDR record, non-continued.
+ GOFFData[Pos + 50] = (char)ArchLevel;
+ }
+
+ void addEsdRecord(uint8_t Type, uint8_t ESDID,
+ const std::vector<uint8_t> &Name, uint8_t ParentESDID = 0,
+ uint8_t BindingScope = 0, uint8_t NameSpaceID = 0,
+ uint8_t AdditionalFlags = 0,
+ std::array<uint8_t, 10> BehavioralAttributes = {},
+ uint32_t Length = 0) {
+ size_t Pos = GOFFData.size();
+ GOFFData.resize(GOFFData.size() + GOFF::RecordLength);
+ ++RecordCount;
+
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 3] = (char)Type;
+ GOFFData[Pos + 7] = (char)ESDID; // ESDID.
+ GOFFData[Pos + 11] = (char)ParentESDID; // Parent ESDID.
+ GOFFData[Pos + 24] = (char)(Length >> 24); // Length (big-endian).
+ GOFFData[Pos + 25] = (char)(Length >> 16);
+ GOFFData[Pos + 26] = (char)(Length >> 8);
+ GOFFData[Pos + 27] = (char)(Length);
+ GOFFData[Pos + 40] = (char)NameSpaceID; // Name Space ID
+ GOFFData[Pos + 41] = (char)AdditionalFlags; // Additional Flags
+
+ for (size_t Offset = 0; Offset < 10; Offset++)
+ GOFFData[Pos + 60 + Offset] = (char)BehavioralAttributes[Offset];
+
+ GOFFData[Pos + 71] = (char)(Name.size()); // Size of symbol name.
+ size_t StringOffset = Pos + 72; // Start of Symbol name
+ for (uint8_t C : Name) {
+ GOFFData[StringOffset] = (char)C;
+ ++StringOffset;
+
+ if (StringOffset == Pos + GOFF::RecordLength) {
+ // If we reach the end of the current record, we need to start a new
+ // one.
+ GOFFData[Pos + 1] |= 0x01; // Set continuation bit in the current
+ // record.
+
+ // start a new continuation record
+ Pos = GOFFData.size();
+ GOFFData.resize(GOFFData.size() + GOFF::RecordLength);
+ ++RecordCount;
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x02; // continuation record
+
+ StringOffset = Pos + 3;
+ }
+ }
+ }
+};
} // namespace
-TEST(GOFFObjectFileTest, createObjectFile) {
- const uint8_t GOFFData[] = {
+TEST_F(GOFFObjectFileTest, createObjectFile) {
+ const uint8_t Data[] = {
0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -60,40 +133,41 @@ TEST(GOFFObjectFileTest, createObjectFile) {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};
- ArrayRef<uint8_t> GOFFRef(GOFFData, sizeof(GOFFData));
- Expected<std::unique_ptr<ObjectFile>> XCOFFObjOrErr =
+ ArrayRef<uint8_t> GOFFRef(Data, sizeof(Data));
+ Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createObjectFile(
MemoryBufferRef(toStringRef(GOFFRef), "dummyGOFF"),
file_magic::goff_object);
- ASSERT_THAT_EXPECTED(XCOFFObjOrErr, Succeeded());
+ ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
}
-TEST(GOFFObjectFileTest, ConstructGOFFObjectValidSize) {
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
- GOFFData[80] = (char)0x03;
- GOFFData[81] = (char)0x40;
- constructValidGOFF(160);
- constructValidGOFF(0);
-}
+TEST_F(GOFFObjectFileTest, ConstructGOFFObjectValidSize) {
+ // HDR record.
+ addHdrRecord();
-TEST(GOFFObjectFileTest, ConstructGOFFObjectInvalidSize) {
- constructInvalidGOFF(70);
- constructInvalidGOFF(79);
- constructInvalidGOFF(81);
+ // END record.
+ addEndRecord();
+
+ constructValidGOFF(GOFFData.data(), GOFFData.size());
+ constructValidGOFF(GOFFData.data(), 0);
}
-TEST(GOFFObjectFileTest, MissingHDR) {
- char GOFFData[GOFF::RecordLength * 2] = {0x00};
+TEST_F(GOFFObjectFileTest, ConstructGOFFObjectInvalidSize) {
+ GOFFData.resize(GOFF::RecordLength * 3);
+ constructInvalidGOFF(GOFFData.data(), 70);
+ constructInvalidGOFF(GOFFData.data(), 79);
+ constructInvalidGOFF(GOFFData.data(), 81);
+}
+TEST_F(GOFFObjectFileTest, MissingHDR) {
// ESD record.
- GOFFData[0] = (char)0x03;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
// END record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
- GOFFData[GOFF::RecordLength + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 2);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -104,17 +178,15 @@ TEST(GOFFObjectFileTest, MissingHDR) {
FailedWithMessage("object file must start with HDR record"));
}
-TEST(GOFFObjectFileTest, MissingEND) {
- char GOFFData[GOFF::RecordLength * 2] = {0x00};
-
+TEST_F(GOFFObjectFileTest, MissingEND) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
- StringRef Data(GOFFData, GOFF::RecordLength * 2);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -124,30 +196,23 @@ TEST(GOFFObjectFileTest, MissingEND) {
GOFFObjOrErr, FailedWithMessage("object file must end with END record"));
}
-TEST(GOFFObjectFileTest, GetSymbolName) {
- char GOFFData[GOFF::RecordLength * 3] = {0x00};
-
+TEST_F(GOFFObjectFileTest, GetSymbolName) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
+ addHdrRecord();
- // ESD record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
- GOFFData[GOFF::RecordLength + 3] = (char)0x02;
- GOFFData[GOFF::RecordLength + 7] = (char)0x01;
- GOFFData[GOFF::RecordLength + 11] = (char)0x01;
- GOFFData[GOFF::RecordLength + 71] = (char)0x05; // Size of symbol name.
- GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is Hello.
- GOFFData[GOFF::RecordLength + 73] = (char)0x85;
- GOFFData[GOFF::RecordLength + 74] = (char)0x93;
- GOFFData[GOFF::RecordLength + 75] = (char)0x93;
- GOFFData[GOFF::RecordLength + 76] = (char)0x96;
+ // ESD record. Symbol name is Hello.
+ addEsdRecord(0x02, 0x01,
+ {0xC8, // H
+ 0x85, // e
+ 0x93, // l
+ 0x93, // l
+ 0x96}, // o
+ 0x01);
// END record.
- GOFFData[GOFF::RecordLength * 2] = 0x03;
- GOFFData[GOFF::RecordLength * 2 + 1] = 0x40;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 3);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -155,7 +220,8 @@ TEST(GOFFObjectFileTest, GetSymbolName) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
for (SymbolRef Symbol : GOFFObj->symbols()) {
Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
@@ -166,27 +232,23 @@ TEST(GOFFObjectFileTest, GetSymbolName) {
}
}
-TEST(GOFFObjectFileTest, ConcatenatedGOFFFile) {
- char GOFFData[GOFF::RecordLength * 6] = {0x00};
-
+TEST_F(GOFFObjectFileTest, ConcatenatedGOFFFile) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
// END record.
- GOFFData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;
+ addEndRecord();
// HDR record.
- GOFFData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFData[GOFF::RecordLength * 3 + 1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFData[GOFF::RecordLength * 4] = (char)0x03;
+ Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
// END record.
- GOFFData[GOFF::RecordLength * 5] = (char)0x03;
- GOFFData[GOFF::RecordLength * 5 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 6);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -195,40 +257,28 @@ TEST(GOFFObjectFileTest, ConcatenatedGOFFFile) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
}
-TEST(GOFFObjectFileTest, ContinuationGetSymbolName) {
- char GOFFContData[GOFF::RecordLength * 4] = {0x00};
-
+TEST_F(GOFFObjectFileTest, ContinuationGetSymbolName) {
// HDR record.
- GOFFContData[0] = (char)0x03;
- GOFFContData[1] = (char)0xF0;
-
- // ESD record.
- GOFFContData[GOFF::RecordLength] = (char)0x03;
- GOFFContData[GOFF::RecordLength + 1] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 3] = (char)0x02;
- GOFFContData[GOFF::RecordLength + 7] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 11] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.
- GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.
- GOFFContData[GOFF::RecordLength + 73] = (char)0x85;
- GOFFContData[GOFF::RecordLength + 74] = (char)0x93;
- GOFFContData[GOFF::RecordLength + 75] = (char)0x93;
- GOFFContData[GOFF::RecordLength + 76] = (char)0x96;
- GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;
- GOFFContData[GOFF::RecordLength + 78] = (char)0x96;
- GOFFContData[GOFF::RecordLength + 79] = (char)0x99;
-
- // ESD continuation record.
- GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x02; // No further continuations.
- GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;
- GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;
+ addHdrRecord();
+
+ // ESD record with continuation. Symbol name is Helloworld.
+ addEsdRecord(0x02, 0x01,
+ {0xC8, // H
+ 0x85, // e
+ 0x93, // l
+ 0x93, // l
+ 0x96, // o
+ 0xA6, // w
+ 0x96, // o
+ 0x99, // r
+ 0x93, // l
+ 0x84}, // d
+ 0x01);
// END record.
- GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFContData, GOFF::RecordLength * 4);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -236,7 +286,8 @@ TEST(GOFFObjectFileTest, ContinuationGetSymbolName) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
for (SymbolRef Symbol : GOFFObj->symbols()) {
Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
@@ -246,40 +297,38 @@ TEST(GOFFObjectFileTest, ContinuationGetSymbolName) {
}
}
-TEST(GOFFObjectFileTest, ContinuationBitNotSet) {
- char GOFFContData[GOFF::RecordLength * 4] = {0x00};
-
+TEST_F(GOFFObjectFileTest, ContinuationBitNotSet) {
// HDR record.
- GOFFContData[0] = (char)0x03;
- GOFFContData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFContData[GOFF::RecordLength] = (char)0x03;
- GOFFContData[GOFF::RecordLength + 1] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 3] = (char)0x02;
- GOFFContData[GOFF::RecordLength + 7] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 11] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.
- GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.
- GOFFContData[GOFF::RecordLength + 73] = (char)0x85;
- GOFFContData[GOFF::RecordLength + 74] = (char)0x93;
- GOFFContData[GOFF::RecordLength + 75] = (char)0x93;
- GOFFContData[GOFF::RecordLength + 76] = (char)0x96;
- GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;
- GOFFContData[GOFF::RecordLength + 78] = (char)0x96;
- GOFFContData[GOFF::RecordLength + 79] = (char)0x99;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x01;
+ GOFFData[Pos + 3] = (char)0x02;
+ GOFFData[Pos + 7] = (char)0x01;
+ GOFFData[Pos + 11] = (char)0x01;
+ GOFFData[Pos + 71] = (char)0x0A; // Size of symbol name.
+ GOFFData[Pos + 72] = (char)0xC8; // Symbol name is HelloWorld.
+ GOFFData[Pos + 73] = (char)0x85;
+ GOFFData[Pos + 74] = (char)0x93;
+ GOFFData[Pos + 75] = (char)0x93;
+ GOFFData[Pos + 76] = (char)0x96;
+ GOFFData[Pos + 77] = (char)0xA6;
+ GOFFData[Pos + 78] = (char)0x96;
+ GOFFData[Pos + 79] = (char)0x99;
// ESD continuation record.
- GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x00;
- GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;
- GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;
+ Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x00;
+ GOFFData[Pos + 3] = (char)0x93;
+ GOFFData[Pos + 4] = (char)0x84;
// END record.
- GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFContData, GOFF::RecordLength * 4);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -290,47 +339,46 @@ TEST(GOFFObjectFileTest, ContinuationBitNotSet) {
"preceding record is continued"));
}
-TEST(GOFFObjectFileTest, ContinuationRecordNotTerminated) {
- char GOFFContData[GOFF::RecordLength * 4] = {0x00};
-
+TEST_F(GOFFObjectFileTest, ContinuationRecordNotTerminated) {
// HDR record.
- GOFFContData[0] = (char)0x03;
- GOFFContData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFContData[GOFF::RecordLength] = (char)0x03;
- GOFFContData[GOFF::RecordLength + 1] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 3] = (char)0x02;
- GOFFContData[GOFF::RecordLength + 7] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 11] = (char)0x01;
- GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.
- GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.
- GOFFContData[GOFF::RecordLength + 73] = (char)0x85;
- GOFFContData[GOFF::RecordLength + 74] = (char)0x93;
- GOFFContData[GOFF::RecordLength + 75] = (char)0x93;
- GOFFContData[GOFF::RecordLength + 76] = (char)0x96;
- GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;
- GOFFContData[GOFF::RecordLength + 78] = (char)0x96;
- GOFFContData[GOFF::RecordLength + 79] = (char)0x99;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x01;
+ GOFFData[Pos + 3] = (char)0x02;
+ GOFFData[Pos + 7] = (char)0x01;
+ GOFFData[Pos + 11] = (char)0x01;
+ GOFFData[Pos + 71] = (char)0x0A; // Size of symbol name.
+ GOFFData[Pos + 72] = (char)0xC8; // Symbol name is HelloWorld.
+ GOFFData[Pos + 73] = (char)0x85;
+ GOFFData[Pos + 74] = (char)0x93;
+ GOFFData[Pos + 75] = (char)0x93;
+ GOFFData[Pos + 76] = (char)0x96;
+ GOFFData[Pos + 77] = (char)0xA6;
+ GOFFData[Pos + 78] = (char)0x96;
+ GOFFData[Pos + 79] = (char)0x99;
// ESD continuation record.
- GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x03; // Continued bit set.
- GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;
- GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;
+ Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x03; // Continued bit set.
+ GOFFData[Pos + 3] = (char)0x93;
+ GOFFData[Pos + 4] = (char)0x84;
// END record.
- GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFContData, GOFF::RecordLength * 4);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
MemoryBufferRef(Data, "dummyGOFF"));
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
for (SymbolRef Symbol : GOFFObj->symbols()) {
Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
@@ -339,25 +387,23 @@ TEST(GOFFObjectFileTest, ContinuationRecordNotTerminated) {
}
}
-TEST(GOFFObjectFileTest, PrevNotContinued) {
- char GOFFContData[GOFF::RecordLength * 4] = {0x00};
-
+TEST_F(GOFFObjectFileTest, PrevNotContinued) {
// HDR record.
- GOFFContData[0] = (char)0x03;
- GOFFContData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record, with continued bit not set.
- GOFFContData[GOFF::RecordLength] = (char)0x03;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
// ESD continuation record.
- GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x02;
+ Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x02;
// END record.
- GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFContData, GOFF::RecordLength * 4);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -369,26 +415,24 @@ TEST(GOFFObjectFileTest, PrevNotContinued) {
"preceded by a continued record"));
}
-TEST(GOFFObjectFileTest, ContinuationTypeMismatch) {
- char GOFFContData[GOFF::RecordLength * 4] = {0x00};
-
+TEST_F(GOFFObjectFileTest, ContinuationTypeMismatch) {
// HDR record.
- GOFFContData[0] = (char)0x03;
- GOFFContData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFContData[GOFF::RecordLength] = (char)0x03;
- GOFFContData[GOFF::RecordLength + 1] = (char)0x01; // Continued to next record.
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x01; // Continued to next record.
// END continuation record.
- GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x42;
+ Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x42;
// END record.
- GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFContData, GOFF::RecordLength * 4);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -400,37 +444,26 @@ TEST(GOFFObjectFileTest, ContinuationTypeMismatch) {
"the type of the previous record"));
}
-TEST(GOFFObjectFileTest, TwoSymbols) {
- char GOFFData[GOFF::RecordLength * 4] = {0x00};
-
+TEST_F(GOFFObjectFileTest, TwoSymbols) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
-
- // ESD record 1.
- GOFFData[GOFF::RecordLength] = (char)0x03;
- GOFFData[GOFF::RecordLength + 3] = (char)0x00;
- GOFFData[GOFF::RecordLength + 7] = (char)0x01; // ESDID.
- GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.
- GOFFData[GOFF::RecordLength + 72] = (char)0xa7; // Symbol name is x.
-
- // ESD record 2.
- GOFFData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFData[GOFF::RecordLength * 2 + 3] = (char)0x03;
- GOFFData[GOFF::RecordLength * 2 + 7] = (char)0x02; // ESDID.
- GOFFData[GOFF::RecordLength * 2 + 11] = (char)0x01; // Parent ESDID.
- GOFFData[GOFF::RecordLength * 2 + 71] = (char)0x05; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 2 + 72] = (char)0xC8; // Symbol name is Hello.
- GOFFData[GOFF::RecordLength * 2 + 73] = (char)0x85;
- GOFFData[GOFF::RecordLength * 2 + 74] = (char)0x93;
- GOFFData[GOFF::RecordLength * 2 + 75] = (char)0x93;
- GOFFData[GOFF::RecordLength * 2 + 76] = (char)0x96;
+ addHdrRecord();
+
+ // ESD record 1. Symbol name is x.
+ addEsdRecord(0x00, 0x01, {0xa7}); // x
+
+ // ESD record 2. Symbol name is Hello.
+ addEsdRecord(0x03, 0x02,
+ {0xC8, // H
+ 0x85, // e
+ 0x93, // l
+ 0x93, // l
+ 0x96}, // o
+ 0x01);
// END record.
- GOFFData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFData[GOFF::RecordLength * 3 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 4);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -438,7 +471,8 @@ TEST(GOFFObjectFileTest, TwoSymbols) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
for (SymbolRef Symbol : GOFFObj->symbols()) {
Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
@@ -448,26 +482,18 @@ TEST(GOFFObjectFileTest, TwoSymbols) {
}
}
-TEST(GOFFObjectFileTest, InvalidSymbolType) {
- char GOFFData[GOFF::RecordLength * 3] = {0x00};
-
+TEST_F(GOFFObjectFileTest, InvalidSymbolType) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
+ addHdrRecord();
- // ESD record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
- GOFFData[GOFF::RecordLength + 3] = (char)0x05;
- GOFFData[GOFF::RecordLength + 7] = (char)0x01;
- GOFFData[GOFF::RecordLength + 11] = (char)0x01;
- GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.
- GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name.
+ // ESD record with invalid symbol type 0x05.
+ addEsdRecord(0x05, 0x01, {0xC8}, // H
+ 0x01);
// END record.
- GOFFData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 3);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -475,7 +501,8 @@ TEST(GOFFObjectFileTest, InvalidSymbolType) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
for (SymbolRef Symbol : GOFFObj->symbols()) {
Expected<SymbolRef::Type> SymbolType = Symbol.getType();
@@ -491,27 +518,24 @@ TEST(GOFFObjectFileTest, InvalidSymbolType) {
}
}
-TEST(GOFFObjectFileTest, InvalidERSymbolType) {
- char GOFFData[GOFF::RecordLength * 3] = {0x00};
-
+TEST_F(GOFFObjectFileTest, InvalidERSymbolType) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
+ addHdrRecord();
// ESD record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
- GOFFData[GOFF::RecordLength + 3] = (char)0x04;
- GOFFData[GOFF::RecordLength + 7] = (char)0x01;
- GOFFData[GOFF::RecordLength + 11] = (char)0x01;
- GOFFData[GOFF::RecordLength + 63] = (char)0x03; // Unknown executable type.
- GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.
- GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name.
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 3] = (char)0x04;
+ GOFFData[Pos + 7] = (char)0x01;
+ GOFFData[Pos + 11] = (char)0x01;
+ GOFFData[Pos + 63] = (char)0x03; // Unknown executable type.
+ GOFFData[Pos + 71] = (char)0x01; // Size of symbol name.
+ GOFFData[Pos + 72] = (char)0xC8; // Symbol name.
// END record.
- GOFFData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 3);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -519,7 +543,8 @@ TEST(GOFFObjectFileTest, InvalidERSymbolType) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
for (SymbolRef Symbol : GOFFObj->symbols()) {
Expected<SymbolRef::Type> SymbolType = Symbol.getType();
@@ -529,78 +554,60 @@ TEST(GOFFObjectFileTest, InvalidERSymbolType) {
}
}
-TEST(GOFFObjectFileTest, TXTConstruct) {
- char GOFFData[GOFF::RecordLength * 6] = {};
-
+TEST_F(GOFFObjectFileTest, TXTConstruct) {
// HDR record.
- GOFFData[0] = (char)0x03;
- GOFFData[1] = (char)0xF0;
- GOFFData[50] = (char)0x01;
-
- // ESD record.
- GOFFData[GOFF::RecordLength] = (char)0x03;
- GOFFData[GOFF::RecordLength + 7] = (char)0x01; // ESDID.
- GOFFData[GOFF::RecordLength + 71] = (char)0x05; // Size of symbol name.
- GOFFData[GOFF::RecordLength + 72] = (char)0xa5; // Symbol name is v.
- GOFFData[GOFF::RecordLength + 73] = (char)0x81; // Symbol name is a.
- GOFFData[GOFF::RecordLength + 74] = (char)0x99; // Symbol name is r.
- GOFFData[GOFF::RecordLength + 75] = (char)0x7b; // Symbol name is #.
- GOFFData[GOFF::RecordLength + 76] = (char)0x83; // Symbol name is c.
-
- // ESD record.
- GOFFData[GOFF::RecordLength * 2] = (char)0x03;
- GOFFData[GOFF::RecordLength * 2 + 3] = (char)0x01;
- GOFFData[GOFF::RecordLength * 2 + 7] = (char)0x02; // ESDID.
- GOFFData[GOFF::RecordLength * 2 + 11] = (char)0x01; // Parent ESDID.
- GOFFData[GOFF::RecordLength * 2 + 27] = (char)0x08; // Length.
- GOFFData[GOFF::RecordLength * 2 + 40] = (char)0x01; // Name Space ID.
- GOFFData[GOFF::RecordLength * 2 + 41] = (char)0x80;
- GOFFData[GOFF::RecordLength * 2 + 60] = (char)0x04; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 2 + 61] = (char)0x04; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 2 + 63] = (char)0x0a; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 2 + 66] = (char)0x03; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 2 + 71] = (char)0x08; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 2 + 72] = (char)0xc3; // Symbol name is c.
- GOFFData[GOFF::RecordLength * 2 + 73] = (char)0x6d; // Symbol name is _.
- GOFFData[GOFF::RecordLength * 2 + 74] = (char)0xc3; // Symbol name is c.
- GOFFData[GOFF::RecordLength * 2 + 75] = (char)0xd6; // Symbol name is o.
- GOFFData[GOFF::RecordLength * 2 + 76] = (char)0xc4; // Symbol name is D.
- GOFFData[GOFF::RecordLength * 2 + 77] = (char)0xc5; // Symbol name is E.
- GOFFData[GOFF::RecordLength * 2 + 78] = (char)0xf6; // Symbol name is 6.
- GOFFData[GOFF::RecordLength * 2 + 79] = (char)0xf4; // Symbol name is 4.
-
- // ESD record.
- GOFFData[GOFF::RecordLength * 3] = (char)0x03;
- GOFFData[GOFF::RecordLength * 3 + 3] = (char)0x02;
- GOFFData[GOFF::RecordLength * 3 + 7] = (char)0x03; // ESDID.
- GOFFData[GOFF::RecordLength * 3 + 11] = (char)0x02; // Parent ESDID.
- GOFFData[GOFF::RecordLength * 3 + 71] = (char)0x05; // Size of symbol name.
- GOFFData[GOFF::RecordLength * 3 + 72] = (char)0xa5; // Symbol name is v.
- GOFFData[GOFF::RecordLength * 3 + 73] = (char)0x81; // Symbol name is a.
- GOFFData[GOFF::RecordLength * 3 + 74] = (char)0x99; // Symbol name is r.
- GOFFData[GOFF::RecordLength * 3 + 75] = (char)0x7b; // Symbol name is #.
- GOFFData[GOFF::RecordLength * 3 + 76] = (char)0x83; // Symbol name is c.
+ addHdrRecord(0x01);
+
+ // ESD record. Symbol name is var#c.
+ addEsdRecord(0x00, 0x01,
+ {0xa5, // v
+ 0x81, // a
+ 0x99, // r
+ 0x7b, // #
+ 0x83}); // c
+
+ // ESD record. Symbol name is c_CoDE64.
+ std::array<uint8_t, 10> BehavioralAttributes = {0x04, 0x04, 0x00, 0x0a, 0x00,
+ 0x00, 0x03, 0x00, 0x00, 0x00};
+ addEsdRecord(0x01, 0x02,
+ {0xc3, // c
+ 0x6d, // _
+ 0xc3, // c
+ 0xd6, // o
+ 0xc4, // D
+ 0xc5, // E
+ 0xf6, // 6
+ 0xf4}, // 4
+ 0x01, 0x00, 0x01, 0x80, BehavioralAttributes, 0x08);
+
+ // ESD record. Symbol name is var#c.
+ addEsdRecord(0x02, 0x03,
+ {0xa5, // v
+ 0x81, // a
+ 0x99, // r
+ 0x7b, // #
+ 0x83}, // c
+ 0x02);
// TXT record.
- GOFFData[GOFF::RecordLength * 4] = (char)0x03;
- GOFFData[GOFF::RecordLength * 4 + 1] = (char)0x10;
- GOFFData[GOFF::RecordLength * 4 + 7] = (char)0x02;
- GOFFData[GOFF::RecordLength * 4 + 23] = (char)0x08; // Data Length.
- GOFFData[GOFF::RecordLength * 4 + 24] = (char)0x12;
- GOFFData[GOFF::RecordLength * 4 + 25] = (char)0x34;
- GOFFData[GOFF::RecordLength * 4 + 26] = (char)0x56;
- GOFFData[GOFF::RecordLength * 4 + 27] = (char)0x78;
- GOFFData[GOFF::RecordLength * 4 + 28] = (char)0x9a;
- GOFFData[GOFF::RecordLength * 4 + 29] = (char)0xbc;
- GOFFData[GOFF::RecordLength * 4 + 30] = (char)0xde;
- GOFFData[GOFF::RecordLength * 4 + 31] = (char)0xf0;
+ size_t Pos = addNewRecord();
+ GOFFData[Pos] = (char)0x03;
+ GOFFData[Pos + 1] = (char)0x10;
+ GOFFData[Pos + 7] = (char)0x02;
+ GOFFData[Pos + 23] = (char)0x08; // Data Length.
+ GOFFData[Pos + 24] = (char)0x12;
+ GOFFData[Pos + 25] = (char)0x34;
+ GOFFData[Pos + 26] = (char)0x56;
+ GOFFData[Pos + 27] = (char)0x78;
+ GOFFData[Pos + 28] = (char)0x9a;
+ GOFFData[Pos + 29] = (char)0xbc;
+ GOFFData[Pos + 30] = (char)0xde;
+ GOFFData[Pos + 31] = (char)0xf0;
// END record.
- GOFFData[GOFF::RecordLength * 5] = (char)0x03;
- GOFFData[GOFF::RecordLength * 5 + 1] = (char)0x40;
- GOFFData[GOFF::RecordLength * 5 + 11] = (char)0x06;
+ addEndRecord();
- StringRef Data(GOFFData, GOFF::RecordLength * 6);
+ StringRef Data(GOFFData.data(), GOFFData.size());
Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
object::ObjectFile::createGOFFObjectFile(
@@ -608,7 +615,8 @@ TEST(GOFFObjectFileTest, TXTConstruct) {
ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
- GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
+ GOFFObjectFile *GOFFObj =
+ static_cast<GOFFObjectFile *>((*GOFFObjOrErr).get());
auto Symbols = GOFFObj->symbols();
ASSERT_EQ(std::distance(Symbols.begin(), Symbols.end()), 1);
SymbolRef Symbol = *Symbols.begin();
More information about the llvm-commits
mailing list