xref: /llvm-project/llvm/unittests/Object/GOFFObjectFileTest.cpp (revision 9d7b35d4e1e0c563e660450687ce475ee1959951)
12fa6bcf0SYusra Syeda //===- GOFFObjectFileTest.cpp - Tests for GOFFObjectFile ------------------===//
22fa6bcf0SYusra Syeda //
32fa6bcf0SYusra Syeda // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42fa6bcf0SYusra Syeda // See https://llvm.org/LICENSE.txt for license information.
52fa6bcf0SYusra Syeda // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62fa6bcf0SYusra Syeda //
72fa6bcf0SYusra Syeda //===----------------------------------------------------------------------===//
82fa6bcf0SYusra Syeda 
92fa6bcf0SYusra Syeda #include "llvm/Object/GOFFObjectFile.h"
102fa6bcf0SYusra Syeda #include "llvm/Support/MemoryBuffer.h"
112fa6bcf0SYusra Syeda #include "llvm/Testing/Support/Error.h"
122fa6bcf0SYusra Syeda #include "gtest/gtest.h"
132fa6bcf0SYusra Syeda 
142fa6bcf0SYusra Syeda using namespace llvm;
152fa6bcf0SYusra Syeda using namespace llvm::object;
162fa6bcf0SYusra Syeda using namespace llvm::GOFF;
172fa6bcf0SYusra Syeda 
182fa6bcf0SYusra Syeda namespace {
192fa6bcf0SYusra Syeda char GOFFData[GOFF::RecordLength * 3] = {0x00};
202fa6bcf0SYusra Syeda 
212fa6bcf0SYusra Syeda void constructValidGOFF(size_t Size) {
222fa6bcf0SYusra Syeda   StringRef ValidSize(GOFFData, Size);
232fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
242fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
252fa6bcf0SYusra Syeda           MemoryBufferRef(ValidSize, "dummyGOFF"));
262fa6bcf0SYusra Syeda 
272fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
282fa6bcf0SYusra Syeda }
292fa6bcf0SYusra Syeda 
302fa6bcf0SYusra Syeda void constructInvalidGOFF(size_t Size) {
312fa6bcf0SYusra Syeda   // Construct GOFFObject with record of length != multiple of 80.
322fa6bcf0SYusra Syeda   StringRef InvalidData(GOFFData, Size);
332fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
342fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
352fa6bcf0SYusra Syeda           MemoryBufferRef(InvalidData, "dummyGOFF"));
362fa6bcf0SYusra Syeda 
372fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(
382fa6bcf0SYusra Syeda       GOFFObjOrErr,
392fa6bcf0SYusra Syeda       FailedWithMessage("object file is not the right size. Must be a multiple "
402fa6bcf0SYusra Syeda                         "of 80 bytes, but is " +
412fa6bcf0SYusra Syeda                         std::to_string(Size) + " bytes"));
422fa6bcf0SYusra Syeda }
432fa6bcf0SYusra Syeda } // namespace
442fa6bcf0SYusra Syeda 
452fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ConstructGOFFObjectValidSize) {
46da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
47da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
48da942feeSSimon Pilgrim   GOFFData[80] = (char)0x03;
49da942feeSSimon Pilgrim   GOFFData[81] = (char)0x40;
502fa6bcf0SYusra Syeda   constructValidGOFF(160);
512fa6bcf0SYusra Syeda   constructValidGOFF(0);
522fa6bcf0SYusra Syeda }
532fa6bcf0SYusra Syeda 
542fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ConstructGOFFObjectInvalidSize) {
552fa6bcf0SYusra Syeda   constructInvalidGOFF(70);
562fa6bcf0SYusra Syeda   constructInvalidGOFF(79);
572fa6bcf0SYusra Syeda   constructInvalidGOFF(81);
582fa6bcf0SYusra Syeda }
592fa6bcf0SYusra Syeda 
602fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, MissingHDR) {
612fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 2] = {0x00};
622fa6bcf0SYusra Syeda 
632fa6bcf0SYusra Syeda   // ESD record.
64da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
652fa6bcf0SYusra Syeda 
662fa6bcf0SYusra Syeda   // END record.
67da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
68da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 1] = (char)0x40;
692fa6bcf0SYusra Syeda 
702fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 2);
712fa6bcf0SYusra Syeda 
722fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
732fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
742fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
752fa6bcf0SYusra Syeda 
762fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(
772fa6bcf0SYusra Syeda       GOFFObjOrErr,
782fa6bcf0SYusra Syeda       FailedWithMessage("object file must start with HDR record"));
792fa6bcf0SYusra Syeda }
802fa6bcf0SYusra Syeda 
812fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, MissingEND) {
822fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 2] = {0x00};
832fa6bcf0SYusra Syeda 
842fa6bcf0SYusra Syeda   // HDR record.
85da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
86da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
872fa6bcf0SYusra Syeda 
882fa6bcf0SYusra Syeda   // ESD record.
89da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
902fa6bcf0SYusra Syeda 
912fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 2);
922fa6bcf0SYusra Syeda 
932fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
942fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
952fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
962fa6bcf0SYusra Syeda 
972fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(
982fa6bcf0SYusra Syeda       GOFFObjOrErr, FailedWithMessage("object file must end with END record"));
992fa6bcf0SYusra Syeda }
1002fa6bcf0SYusra Syeda 
1012fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, GetSymbolName) {
1022fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 3] = {0x00};
1032fa6bcf0SYusra Syeda 
1042fa6bcf0SYusra Syeda   // HDR record.
105da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
106da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
1072fa6bcf0SYusra Syeda 
1082fa6bcf0SYusra Syeda   // ESD record.
109da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
110da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 3] = (char)0x02;
111da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 7] = (char)0x01;
112da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 11] = (char)0x01;
113da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 71] = (char)0x05; // Size of symbol name.
114da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is Hello.
115da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 73] = (char)0x85;
116da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 74] = (char)0x93;
117da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 75] = (char)0x93;
118da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 76] = (char)0x96;
1192fa6bcf0SYusra Syeda 
1202fa6bcf0SYusra Syeda   // END record.
1212fa6bcf0SYusra Syeda   GOFFData[GOFF::RecordLength * 2] = 0x03;
1222fa6bcf0SYusra Syeda   GOFFData[GOFF::RecordLength * 2 + 1] = 0x40;
1232fa6bcf0SYusra Syeda 
1242fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 3);
1252fa6bcf0SYusra Syeda 
1262fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
1272fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
1282fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
1292fa6bcf0SYusra Syeda 
1302fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
1312fa6bcf0SYusra Syeda 
1322fa6bcf0SYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
1332fa6bcf0SYusra Syeda 
1342fa6bcf0SYusra Syeda   for (SymbolRef Symbol : GOFFObj->symbols()) {
1352fa6bcf0SYusra Syeda     Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
1362fa6bcf0SYusra Syeda     ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());
1372fa6bcf0SYusra Syeda     StringRef SymbolName = SymbolNameOrErr.get();
1382fa6bcf0SYusra Syeda 
1392fa6bcf0SYusra Syeda     EXPECT_EQ(SymbolName, "Hello");
1402fa6bcf0SYusra Syeda   }
1412fa6bcf0SYusra Syeda }
1422fa6bcf0SYusra Syeda 
1432fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ConcatenatedGOFFFile) {
1442fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 6] = {0x00};
1452fa6bcf0SYusra Syeda 
1462fa6bcf0SYusra Syeda   // HDR record.
147da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
148da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
1492fa6bcf0SYusra Syeda   // ESD record.
150da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
1512fa6bcf0SYusra Syeda   // END record.
152da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2] = (char)0x03;
153da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;
1542fa6bcf0SYusra Syeda   // HDR record.
155da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 3] = (char)0x03;
156da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 3 + 1] = (char)0xF0;
1572fa6bcf0SYusra Syeda   // ESD record.
158da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 4] = (char)0x03;
1592fa6bcf0SYusra Syeda   // END record.
160da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 5] = (char)0x03;
161da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 5 + 1] = (char)0x40;
1622fa6bcf0SYusra Syeda 
1632fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 6);
1642fa6bcf0SYusra Syeda 
1652fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
1662fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
1672fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
1682fa6bcf0SYusra Syeda 
1692fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
1702fa6bcf0SYusra Syeda }
1712fa6bcf0SYusra Syeda 
1722fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ContinuationGetSymbolName) {
1732fa6bcf0SYusra Syeda   char GOFFContData[GOFF::RecordLength * 4] = {0x00};
1742fa6bcf0SYusra Syeda 
1752fa6bcf0SYusra Syeda   // HDR record.
176da942feeSSimon Pilgrim   GOFFContData[0] = (char)0x03;
177da942feeSSimon Pilgrim   GOFFContData[1] = (char)0xF0;
1782fa6bcf0SYusra Syeda 
1792fa6bcf0SYusra Syeda   // ESD record.
180da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength] = (char)0x03;
181da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 1] = (char)0x01;
182da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 3] = (char)0x02;
183da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 7] = (char)0x01;
184da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 11] = (char)0x01;
185da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.
186da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.
187da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 73] = (char)0x85;
188da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 74] = (char)0x93;
189da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 75] = (char)0x93;
190da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 76] = (char)0x96;
191da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;
192da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 78] = (char)0x96;
193da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 79] = (char)0x99;
1942fa6bcf0SYusra Syeda 
1952fa6bcf0SYusra Syeda   // ESD continuation record.
196da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
197da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x02; // No further continuations.
198da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;
199da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;
2002fa6bcf0SYusra Syeda 
2012fa6bcf0SYusra Syeda   // END record.
202da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
203da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
2042fa6bcf0SYusra Syeda 
2052fa6bcf0SYusra Syeda   StringRef Data(GOFFContData, GOFF::RecordLength * 4);
2062fa6bcf0SYusra Syeda 
2072fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
2082fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
2092fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
2102fa6bcf0SYusra Syeda 
2112fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
2122fa6bcf0SYusra Syeda 
2132fa6bcf0SYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
2142fa6bcf0SYusra Syeda 
2152fa6bcf0SYusra Syeda   for (SymbolRef Symbol : GOFFObj->symbols()) {
2162fa6bcf0SYusra Syeda     Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
2172fa6bcf0SYusra Syeda     ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());
2182fa6bcf0SYusra Syeda     StringRef SymbolName = SymbolNameOrErr.get();
2192fa6bcf0SYusra Syeda     EXPECT_EQ(SymbolName, "Helloworld");
2202fa6bcf0SYusra Syeda   }
2212fa6bcf0SYusra Syeda }
2222fa6bcf0SYusra Syeda 
2232fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ContinuationBitNotSet) {
2242fa6bcf0SYusra Syeda   char GOFFContData[GOFF::RecordLength * 4] = {0x00};
2252fa6bcf0SYusra Syeda 
2262fa6bcf0SYusra Syeda   // HDR record.
227da942feeSSimon Pilgrim   GOFFContData[0] = (char)0x03;
228da942feeSSimon Pilgrim   GOFFContData[1] = (char)0xF0;
2292fa6bcf0SYusra Syeda 
2302fa6bcf0SYusra Syeda   // ESD record.
231da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength] = (char)0x03;
232da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 1] = (char)0x01;
233da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 3] = (char)0x02;
234da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 7] = (char)0x01;
235da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 11] = (char)0x01;
236da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.
237da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.
238da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 73] = (char)0x85;
239da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 74] = (char)0x93;
240da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 75] = (char)0x93;
241da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 76] = (char)0x96;
242da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;
243da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 78] = (char)0x96;
244da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 79] = (char)0x99;
2452fa6bcf0SYusra Syeda 
2462fa6bcf0SYusra Syeda   // ESD continuation record.
247da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
248da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x00;
249da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;
250da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;
2512fa6bcf0SYusra Syeda 
2522fa6bcf0SYusra Syeda   // END record.
253da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
254da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
2552fa6bcf0SYusra Syeda 
2562fa6bcf0SYusra Syeda   StringRef Data(GOFFContData, GOFF::RecordLength * 4);
2572fa6bcf0SYusra Syeda 
2582fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
2592fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
2602fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
2612fa6bcf0SYusra Syeda   EXPECT_THAT_EXPECTED(
2622fa6bcf0SYusra Syeda       GOFFObjOrErr,
2632fa6bcf0SYusra Syeda       FailedWithMessage("record 2 is not a continuation record but the "
2642fa6bcf0SYusra Syeda                         "preceding record is continued"));
2652fa6bcf0SYusra Syeda }
2662fa6bcf0SYusra Syeda 
2672fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ContinuationRecordNotTerminated) {
2682fa6bcf0SYusra Syeda   char GOFFContData[GOFF::RecordLength * 4] = {0x00};
2692fa6bcf0SYusra Syeda 
2702fa6bcf0SYusra Syeda   // HDR record.
271da942feeSSimon Pilgrim   GOFFContData[0] = (char)0x03;
272da942feeSSimon Pilgrim   GOFFContData[1] = (char)0xF0;
2732fa6bcf0SYusra Syeda 
2742fa6bcf0SYusra Syeda   // ESD record.
275da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength] = (char)0x03;
276da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 1] = (char)0x01;
277da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 3] = (char)0x02;
278da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 7] = (char)0x01;
279da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 11] = (char)0x01;
280da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 71] = (char)0x0A; // Size of symbol name.
281da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name is HelloWorld.
282da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 73] = (char)0x85;
283da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 74] = (char)0x93;
284da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 75] = (char)0x93;
285da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 76] = (char)0x96;
286da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 77] = (char)0xA6;
287da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 78] = (char)0x96;
288da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 79] = (char)0x99;
2892fa6bcf0SYusra Syeda 
2902fa6bcf0SYusra Syeda   // ESD continuation record.
291da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
292da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x03; // Continued bit set.
293da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 3] = (char)0x93;
294da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 4] = (char)0x84;
2952fa6bcf0SYusra Syeda 
2962fa6bcf0SYusra Syeda   // END record.
297da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
298da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
2992fa6bcf0SYusra Syeda 
3002fa6bcf0SYusra Syeda   StringRef Data(GOFFContData, GOFF::RecordLength * 4);
3012fa6bcf0SYusra Syeda 
3022fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
3032fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
3042fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
3052fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
3062fa6bcf0SYusra Syeda 
3072fa6bcf0SYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
3082fa6bcf0SYusra Syeda 
3092fa6bcf0SYusra Syeda   for (SymbolRef Symbol : GOFFObj->symbols()) {
3102fa6bcf0SYusra Syeda     Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
3112fa6bcf0SYusra Syeda     EXPECT_THAT_EXPECTED(SymbolNameOrErr,
3122fa6bcf0SYusra Syeda                          FailedWithMessage("continued bit should not be set"));
3132fa6bcf0SYusra Syeda   }
3142fa6bcf0SYusra Syeda }
3152fa6bcf0SYusra Syeda 
3162fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, PrevNotContinued) {
3172fa6bcf0SYusra Syeda   char GOFFContData[GOFF::RecordLength * 4] = {0x00};
3182fa6bcf0SYusra Syeda 
3192fa6bcf0SYusra Syeda   // HDR record.
320da942feeSSimon Pilgrim   GOFFContData[0] = (char)0x03;
321da942feeSSimon Pilgrim   GOFFContData[1] = (char)0xF0;
3222fa6bcf0SYusra Syeda 
3232fa6bcf0SYusra Syeda   // ESD record, with continued bit not set.
324da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength] = (char)0x03;
3252fa6bcf0SYusra Syeda 
3262fa6bcf0SYusra Syeda   // ESD continuation record.
327da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
328da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x02;
3292fa6bcf0SYusra Syeda 
3302fa6bcf0SYusra Syeda   // END record.
331da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
332da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
3332fa6bcf0SYusra Syeda 
3342fa6bcf0SYusra Syeda   StringRef Data(GOFFContData, GOFF::RecordLength * 4);
3352fa6bcf0SYusra Syeda 
3362fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
3372fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
3382fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
3392fa6bcf0SYusra Syeda 
3402fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(
3412fa6bcf0SYusra Syeda       GOFFObjOrErr,
3422fa6bcf0SYusra Syeda       FailedWithMessage("record 2 is a continuation record that is not "
3432fa6bcf0SYusra Syeda                         "preceded by a continued record"));
3442fa6bcf0SYusra Syeda }
3452fa6bcf0SYusra Syeda 
3462fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, ContinuationTypeMismatch) {
3472fa6bcf0SYusra Syeda   char GOFFContData[GOFF::RecordLength * 4] = {0x00};
3482fa6bcf0SYusra Syeda 
3492fa6bcf0SYusra Syeda   // HDR record.
350da942feeSSimon Pilgrim   GOFFContData[0] = (char)0x03;
351da942feeSSimon Pilgrim   GOFFContData[1] = (char)0xF0;
3522fa6bcf0SYusra Syeda 
3532fa6bcf0SYusra Syeda   // ESD record.
354da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength] = (char)0x03;
355da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength + 1] = (char)0x01; // Continued to next record.
3562fa6bcf0SYusra Syeda 
3572fa6bcf0SYusra Syeda   // END continuation record.
358da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2] = (char)0x03;
359da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 2 + 1] = (char)0x42;
3602fa6bcf0SYusra Syeda 
3612fa6bcf0SYusra Syeda   // END record.
362da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3] = (char)0x03;
363da942feeSSimon Pilgrim   GOFFContData[GOFF::RecordLength * 3 + 1] = (char)0x40;
3642fa6bcf0SYusra Syeda 
3652fa6bcf0SYusra Syeda   StringRef Data(GOFFContData, GOFF::RecordLength * 4);
3662fa6bcf0SYusra Syeda 
3672fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
3682fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
3692fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
3702fa6bcf0SYusra Syeda 
3712fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(
3722fa6bcf0SYusra Syeda       GOFFObjOrErr,
3732fa6bcf0SYusra Syeda       FailedWithMessage("record 2 is a continuation record that does not match "
3742fa6bcf0SYusra Syeda                         "the type of the previous record"));
3752fa6bcf0SYusra Syeda }
3762fa6bcf0SYusra Syeda 
3772fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, TwoSymbols) {
3782fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 4] = {0x00};
3792fa6bcf0SYusra Syeda 
3802fa6bcf0SYusra Syeda   // HDR record.
381da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
382da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
3832fa6bcf0SYusra Syeda 
3842fa6bcf0SYusra Syeda   // ESD record 1.
385da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
386da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 3] = (char)0x00;
387da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 7] = (char)0x01;  // ESDID.
388da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.
389da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 72] = (char)0xa7; // Symbol name is x.
3902fa6bcf0SYusra Syeda 
3912fa6bcf0SYusra Syeda   // ESD record 2.
392da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2] = (char)0x03;
393da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 3] = (char)0x03;
394da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 7] = (char)0x02;  // ESDID.
395da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 11] = (char)0x01; // Parent ESDID.
396da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 71] = (char)0x05; // Size of symbol name.
397da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 72] = (char)0xC8; // Symbol name is Hello.
398da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 73] = (char)0x85;
399da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 74] = (char)0x93;
400da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 75] = (char)0x93;
401da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 76] = (char)0x96;
4022fa6bcf0SYusra Syeda 
4032fa6bcf0SYusra Syeda   // END record.
404da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 3] = (char)0x03;
405da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 3 + 1] = (char)0x40;
4062fa6bcf0SYusra Syeda 
4072fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 4);
4082fa6bcf0SYusra Syeda 
4092fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
4102fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
4112fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
4122fa6bcf0SYusra Syeda 
4132fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
4142fa6bcf0SYusra Syeda 
4152fa6bcf0SYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
4162fa6bcf0SYusra Syeda 
4172fa6bcf0SYusra Syeda   for (SymbolRef Symbol : GOFFObj->symbols()) {
4182fa6bcf0SYusra Syeda     Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
4192fa6bcf0SYusra Syeda     ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());
4202fa6bcf0SYusra Syeda     StringRef SymbolName = SymbolNameOrErr.get();
4212fa6bcf0SYusra Syeda     EXPECT_EQ(SymbolName, "Hello");
4222fa6bcf0SYusra Syeda   }
4232fa6bcf0SYusra Syeda }
4242fa6bcf0SYusra Syeda 
4252fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, InvalidSymbolType) {
4262fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 3] = {0x00};
4272fa6bcf0SYusra Syeda 
4282fa6bcf0SYusra Syeda   // HDR record.
429da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
430da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
4312fa6bcf0SYusra Syeda 
4322fa6bcf0SYusra Syeda   // ESD record.
433da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
434da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 3] = (char)0x05;
435da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 7] = (char)0x01;
436da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 11] = (char)0x01;
437da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.
438da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name.
4392fa6bcf0SYusra Syeda 
4402fa6bcf0SYusra Syeda   // END record.
441da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2] = (char)0x03;
442da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;
4432fa6bcf0SYusra Syeda 
4442fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 3);
4452fa6bcf0SYusra Syeda 
4462fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
4472fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
4482fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
4492fa6bcf0SYusra Syeda 
4502fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
4512fa6bcf0SYusra Syeda 
4522fa6bcf0SYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
4532fa6bcf0SYusra Syeda 
4542fa6bcf0SYusra Syeda   for (SymbolRef Symbol : GOFFObj->symbols()) {
4552fa6bcf0SYusra Syeda     Expected<SymbolRef::Type> SymbolType = Symbol.getType();
4562fa6bcf0SYusra Syeda     EXPECT_THAT_EXPECTED(
4572fa6bcf0SYusra Syeda         SymbolType,
4582fa6bcf0SYusra Syeda         FailedWithMessage("ESD record 1 has invalid symbol type 0x05"));
4592fa6bcf0SYusra Syeda 
4602fa6bcf0SYusra Syeda     Expected<section_iterator> SymSI = Symbol.getSection();
4612fa6bcf0SYusra Syeda     ASSERT_THAT_EXPECTED(
4622fa6bcf0SYusra Syeda         SymSI,
4632fa6bcf0SYusra Syeda         FailedWithMessage(
4642fa6bcf0SYusra Syeda             "symbol with ESD id 1 refers to invalid section with ESD id 1"));
4652fa6bcf0SYusra Syeda   }
4662fa6bcf0SYusra Syeda }
4672fa6bcf0SYusra Syeda 
4682fa6bcf0SYusra Syeda TEST(GOFFObjectFileTest, InvalidERSymbolType) {
4692fa6bcf0SYusra Syeda   char GOFFData[GOFF::RecordLength * 3] = {0x00};
4702fa6bcf0SYusra Syeda 
4712fa6bcf0SYusra Syeda   // HDR record.
472da942feeSSimon Pilgrim   GOFFData[0] = (char)0x03;
473da942feeSSimon Pilgrim   GOFFData[1] = (char)0xF0;
4742fa6bcf0SYusra Syeda 
4752fa6bcf0SYusra Syeda   // ESD record.
476da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength] = (char)0x03;
477da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 3] = (char)0x04;
478da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 7] = (char)0x01;
479da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 11] = (char)0x01;
480da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 63] = (char)0x03; // Unknown executable type.
481da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 71] = (char)0x01; // Size of symbol name.
482da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength + 72] = (char)0xC8; // Symbol name.
4832fa6bcf0SYusra Syeda 
4842fa6bcf0SYusra Syeda   // END record.
485da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2] = (char)0x03;
486da942feeSSimon Pilgrim   GOFFData[GOFF::RecordLength * 2 + 1] = (char)0x40;
4872fa6bcf0SYusra Syeda 
4882fa6bcf0SYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 3);
4892fa6bcf0SYusra Syeda 
4902fa6bcf0SYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
4912fa6bcf0SYusra Syeda       object::ObjectFile::createGOFFObjectFile(
4922fa6bcf0SYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
4932fa6bcf0SYusra Syeda 
4942fa6bcf0SYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
4952fa6bcf0SYusra Syeda 
4962fa6bcf0SYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
4972fa6bcf0SYusra Syeda 
4982fa6bcf0SYusra Syeda   for (SymbolRef Symbol : GOFFObj->symbols()) {
4992fa6bcf0SYusra Syeda     Expected<SymbolRef::Type> SymbolType = Symbol.getType();
5002fa6bcf0SYusra Syeda     EXPECT_THAT_EXPECTED(
5012fa6bcf0SYusra Syeda         SymbolType,
5022fa6bcf0SYusra Syeda         FailedWithMessage("ESD record 1 has unknown Executable type 0x03"));
5032fa6bcf0SYusra Syeda   }
5042fa6bcf0SYusra Syeda }
5054c718fdbSYusra Syeda 
5064c718fdbSYusra Syeda TEST(GOFFObjectFileTest, TXTConstruct) {
5074c718fdbSYusra Syeda   char GOFFData[GOFF::RecordLength * 6] = {};
5084c718fdbSYusra Syeda 
5094c718fdbSYusra Syeda   // HDR record.
510*9d7b35d4SJinsong Ji   GOFFData[0] = (char)0x03;
511*9d7b35d4SJinsong Ji   GOFFData[1] = (char)0xF0;
512*9d7b35d4SJinsong Ji   GOFFData[50] = (char)0x01;
5134c718fdbSYusra Syeda 
5144c718fdbSYusra Syeda   // ESD record.
515*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength] = (char)0x03;
516*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 7] = (char)0x01;  // ESDID.
517*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 71] = (char)0x05; // Size of symbol name.
518*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 72] = (char)0xa5; // Symbol name is v.
519*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 73] = (char)0x81; // Symbol name is a.
520*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 74] = (char)0x99; // Symbol name is r.
521*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 75] = (char)0x7b; // Symbol name is #.
522*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength + 76] = (char)0x83; // Symbol name is c.
5234c718fdbSYusra Syeda 
5244c718fdbSYusra Syeda   // ESD record.
525*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2] = (char)0x03;
526*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 3] = (char)0x01;
527*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 7] = (char)0x02;  // ESDID.
528*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 11] = (char)0x01; // Parent ESDID.
529*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 27] = (char)0x08; // Length.
530*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 40] = (char)0x01; // Name Space ID.
531*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 41] = (char)0x80;
532*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 60] = (char)0x04; // Size of symbol name.
533*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 61] = (char)0x04; // Size of symbol name.
534*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 63] = (char)0x0a; // Size of symbol name.
535*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 66] = (char)0x03; // Size of symbol name.
536*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 71] = (char)0x08; // Size of symbol name.
537*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 72] = (char)0xc3; // Symbol name is c.
538*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 73] = (char)0x6d; // Symbol name is _.
539*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 74] = (char)0xc3; // Symbol name is c.
540*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 75] = (char)0xd6; // Symbol name is o.
541*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 76] = (char)0xc4; // Symbol name is D.
542*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 77] = (char)0xc5; // Symbol name is E.
543*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 78] = (char)0xf6; // Symbol name is 6.
544*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 2 + 79] = (char)0xf4; // Symbol name is 4.
5454c718fdbSYusra Syeda 
5464c718fdbSYusra Syeda   // ESD record.
547*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3] = (char)0x03;
548*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 3] = (char)0x02;
549*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 7] = (char)0x03;  // ESDID.
550*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 11] = (char)0x02; // Parent ESDID.
551*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 71] = (char)0x05; // Size of symbol name.
552*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 72] = (char)0xa5; // Symbol name is v.
553*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 73] = (char)0x81; // Symbol name is a.
554*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 74] = (char)0x99; // Symbol name is r.
555*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 75] = (char)0x7b; // Symbol name is #.
556*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 3 + 76] = (char)0x83; // Symbol name is c.
5574c718fdbSYusra Syeda 
5584c718fdbSYusra Syeda   // TXT record.
559*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4] = (char)0x03;
560*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 1] = (char)0x10;
561*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 7] = (char)0x02;
562*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 23] = (char)0x08; // Data Length.
563*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 24] = (char)0x12;
564*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 25] = (char)0x34;
565*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 26] = (char)0x56;
566*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 27] = (char)0x78;
567*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 28] = (char)0x9a;
568*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 29] = (char)0xbc;
569*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 30] = (char)0xde;
570*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 4 + 31] = (char)0xf0;
5714c718fdbSYusra Syeda 
5724c718fdbSYusra Syeda   // END record.
573*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 5] = (char)0x03;
574*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 5 + 1] = (char)0x40;
575*9d7b35d4SJinsong Ji   GOFFData[GOFF::RecordLength * 5 + 11] = (char)0x06;
5764c718fdbSYusra Syeda 
5774c718fdbSYusra Syeda   StringRef Data(GOFFData, GOFF::RecordLength * 6);
5784c718fdbSYusra Syeda 
5794c718fdbSYusra Syeda   Expected<std::unique_ptr<ObjectFile>> GOFFObjOrErr =
5804c718fdbSYusra Syeda       object::ObjectFile::createGOFFObjectFile(
5814c718fdbSYusra Syeda           MemoryBufferRef(Data, "dummyGOFF"));
5824c718fdbSYusra Syeda 
5834c718fdbSYusra Syeda   ASSERT_THAT_EXPECTED(GOFFObjOrErr, Succeeded());
5844c718fdbSYusra Syeda 
5854c718fdbSYusra Syeda   GOFFObjectFile *GOFFObj = dyn_cast<GOFFObjectFile>((*GOFFObjOrErr).get());
5864c718fdbSYusra Syeda   auto Symbols = GOFFObj->symbols();
5874c718fdbSYusra Syeda   ASSERT_EQ(std::distance(Symbols.begin(), Symbols.end()), 1);
5884c718fdbSYusra Syeda   SymbolRef Symbol = *Symbols.begin();
5894c718fdbSYusra Syeda   Expected<StringRef> SymbolNameOrErr = GOFFObj->getSymbolName(Symbol);
5904c718fdbSYusra Syeda   ASSERT_THAT_EXPECTED(SymbolNameOrErr, Succeeded());
5914c718fdbSYusra Syeda   StringRef SymbolName = SymbolNameOrErr.get();
5924c718fdbSYusra Syeda   EXPECT_EQ(SymbolName, "var#c");
5934c718fdbSYusra Syeda 
5944c718fdbSYusra Syeda   auto Sections = GOFFObj->sections();
5954c718fdbSYusra Syeda   ASSERT_EQ(std::distance(Sections.begin(), Sections.end()), 1);
5964c718fdbSYusra Syeda   SectionRef Section = *Sections.begin();
5974c718fdbSYusra Syeda   Expected<StringRef> SectionContent = Section.getContents();
5984c718fdbSYusra Syeda   ASSERT_THAT_EXPECTED(SectionContent, Succeeded());
5994c718fdbSYusra Syeda   StringRef Contents = SectionContent.get();
6004c718fdbSYusra Syeda   EXPECT_EQ(Contents, "\x12\x34\x56\x78\x9a\xbc\xde\xf0");
6014c718fdbSYusra Syeda }
602