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