12f0d755dSdiggerlin //===- XCOFFObjectFileTest.cpp - Tests for XCOFFObjectFile ----------------===//
22f0d755dSdiggerlin //
32f0d755dSdiggerlin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42f0d755dSdiggerlin // See https://llvm.org/LICENSE.txt for license information.
52f0d755dSdiggerlin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62f0d755dSdiggerlin //
72f0d755dSdiggerlin //===----------------------------------------------------------------------===//
82f0d755dSdiggerlin 
992c527e5SGeorgii Rymar #include "llvm/Object/ELFObjectFile.h"
102f0d755dSdiggerlin #include "llvm/Object/XCOFFObjectFile.h"
112f0d755dSdiggerlin #include "llvm/Testing/Support/Error.h"
122f0d755dSdiggerlin #include "gtest/gtest.h"
132f0d755dSdiggerlin 
142f0d755dSdiggerlin using namespace llvm;
152f0d755dSdiggerlin using namespace llvm::object;
16ab77fa51Sdiggerlin using namespace llvm::XCOFF;
172f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFObjectType)1892c527e5SGeorgii Rymar TEST(XCOFFObjectFileTest, XCOFFObjectType) {
1992c527e5SGeorgii Rymar   // Create an arbitrary object of a non-XCOFF type and test that
2092c527e5SGeorgii Rymar   // dyn_cast<XCOFFObjectFile> returns null for it.
2192c527e5SGeorgii Rymar   char Buf[sizeof(typename ELF64LE::Ehdr)] = {};
2292c527e5SGeorgii Rymar   memcpy(Buf, "\177ELF", 4);
2392c527e5SGeorgii Rymar 
2492c527e5SGeorgii Rymar   auto *EHdr = reinterpret_cast<typename ELF64LE::Ehdr *>(Buf);
2592c527e5SGeorgii Rymar   EHdr->e_ident[llvm::ELF::EI_CLASS] = llvm::ELF::ELFCLASS64;
2692c527e5SGeorgii Rymar   EHdr->e_ident[llvm::ELF::EI_DATA] = llvm::ELF::ELFDATA2LSB;
2792c527e5SGeorgii Rymar 
2892c527e5SGeorgii Rymar   MemoryBufferRef Source(StringRef(Buf, sizeof(Buf)), "non-XCOFF");
2992c527e5SGeorgii Rymar   Expected<std::unique_ptr<ObjectFile>> ObjOrErr =
3092c527e5SGeorgii Rymar       ObjectFile::createObjectFile(Source);
3192c527e5SGeorgii Rymar   ASSERT_THAT_EXPECTED(ObjOrErr, Succeeded());
3292c527e5SGeorgii Rymar 
3392c527e5SGeorgii Rymar   EXPECT_TRUE(dyn_cast<XCOFFObjectFile>((*ObjOrErr).get()) == nullptr);
3492c527e5SGeorgii Rymar }
3592c527e5SGeorgii Rymar 
TEST(XCOFFObjectFileTest,doesXCOFFTracebackTableBegin)362f0d755dSdiggerlin TEST(XCOFFObjectFileTest, doesXCOFFTracebackTableBegin) {
372f0d755dSdiggerlin   EXPECT_TRUE(doesXCOFFTracebackTableBegin({0, 0, 0, 0}));
382f0d755dSdiggerlin   EXPECT_TRUE(doesXCOFFTracebackTableBegin({0, 0, 0, 0, 1}));
392f0d755dSdiggerlin   EXPECT_FALSE(doesXCOFFTracebackTableBegin({0, 0, 0, 1}));
402f0d755dSdiggerlin   EXPECT_FALSE(doesXCOFFTracebackTableBegin({0, 0, 0}));
412f0d755dSdiggerlin }
422f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIGeneral)432f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIGeneral) {
442f0d755dSdiggerlin   uint8_t V[] = {0x00, 0x00, 0x22, 0x40, 0x80, 0x00, 0x01, 0x05, 0x58, 0x00,
452f0d755dSdiggerlin                  0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0x61, 0x64,
462f0d755dSdiggerlin                  0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00};
472f0d755dSdiggerlin   uint64_t Size = sizeof(V);
482f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr = XCOFFTracebackTable::create(V, Size);
492f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
502f0d755dSdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
512f0d755dSdiggerlin 
522f0d755dSdiggerlin   EXPECT_EQ(TT.getVersion(), 0);
532f0d755dSdiggerlin 
542f0d755dSdiggerlin   EXPECT_EQ(TT.getLanguageID(), 0);
552f0d755dSdiggerlin 
562f0d755dSdiggerlin   EXPECT_FALSE(TT.isGlobalLinkage());
572f0d755dSdiggerlin   EXPECT_FALSE(TT.isOutOfLineEpilogOrPrologue());
582f0d755dSdiggerlin   EXPECT_TRUE(TT.hasTraceBackTableOffset());
592f0d755dSdiggerlin   EXPECT_FALSE(TT.isInternalProcedure());
602f0d755dSdiggerlin   EXPECT_FALSE(TT.hasControlledStorage());
612f0d755dSdiggerlin   EXPECT_FALSE(TT.isTOCless());
622f0d755dSdiggerlin   EXPECT_TRUE(TT.isFloatingPointPresent());
632f0d755dSdiggerlin   EXPECT_FALSE(TT.isFloatingPointOperationLogOrAbortEnabled());
642f0d755dSdiggerlin 
652f0d755dSdiggerlin   EXPECT_FALSE(TT.isInterruptHandler());
662f0d755dSdiggerlin   EXPECT_TRUE(TT.isFuncNamePresent());
672f0d755dSdiggerlin   EXPECT_FALSE(TT.isAllocaUsed());
682f0d755dSdiggerlin   EXPECT_EQ(TT.getOnConditionDirective(), 0);
692f0d755dSdiggerlin   EXPECT_FALSE(TT.isCRSaved());
702f0d755dSdiggerlin   EXPECT_FALSE(TT.isLRSaved());
712f0d755dSdiggerlin 
722f0d755dSdiggerlin   EXPECT_TRUE(TT.isBackChainStored());
732f0d755dSdiggerlin   EXPECT_FALSE(TT.isFixup());
742f0d755dSdiggerlin   EXPECT_EQ(TT.getNumOfFPRsSaved(), 0);
752f0d755dSdiggerlin 
762f0d755dSdiggerlin   EXPECT_FALSE(TT.hasExtensionTable());
772f0d755dSdiggerlin   EXPECT_FALSE(TT.hasVectorInfo());
78c80fbdf2Sdiggerlin   EXPECT_EQ(TT.getNumOfGPRsSaved(), 0);
792f0d755dSdiggerlin 
802f0d755dSdiggerlin   EXPECT_EQ(TT.getNumberOfFixedParms(), 1);
812f0d755dSdiggerlin 
822f0d755dSdiggerlin   EXPECT_EQ(TT.getNumberOfFPParms(), 2);
832f0d755dSdiggerlin   EXPECT_TRUE(TT.hasParmsOnStack());
842f0d755dSdiggerlin 
852f0d755dSdiggerlin   ASSERT_TRUE(TT.getParmsType());
86*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getParmsType().value(), "i, f, d");
872f0d755dSdiggerlin 
882f0d755dSdiggerlin   ASSERT_TRUE(TT.getTraceBackTableOffset());
89*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getTraceBackTableOffset().value(), 64u);
902f0d755dSdiggerlin 
912f0d755dSdiggerlin   EXPECT_FALSE(TT.getHandlerMask());
922f0d755dSdiggerlin 
932f0d755dSdiggerlin   ASSERT_TRUE(TT.getFunctionName());
94*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getFunctionName().value(), "add_all");
95*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getFunctionName().value().size(), 7u);
962f0d755dSdiggerlin 
972f0d755dSdiggerlin   EXPECT_FALSE(TT.getAllocaRegister());
982f0d755dSdiggerlin   EXPECT_EQ(Size, 25u);
992f0d755dSdiggerlin }
1002f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIParmsType)1012f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIParmsType) {
1022f0d755dSdiggerlin   uint8_t V[] = {0x01, 0x02, 0xA2, 0x40, 0x80, 0x00, 0x02, 0x07, 0x2B, 0x00,
1032f0d755dSdiggerlin                  0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0x61, 0x64,
1042f0d755dSdiggerlin                  0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00};
1052f0d755dSdiggerlin   uint64_t Size = sizeof(V);
1062f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr = XCOFFTracebackTable::create(V, Size);
1072f0d755dSdiggerlin 
1082f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
1092f0d755dSdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
1102f0d755dSdiggerlin   EXPECT_EQ(TT.getVersion(), 1);
1112f0d755dSdiggerlin   EXPECT_EQ(TT.getLanguageID(), 2);
1122f0d755dSdiggerlin 
1132f0d755dSdiggerlin   EXPECT_TRUE(TT.isGlobalLinkage());
1142f0d755dSdiggerlin   EXPECT_EQ(TT.getNumberOfFixedParms(), 2);
1152f0d755dSdiggerlin 
1162f0d755dSdiggerlin   EXPECT_EQ(TT.getNumberOfFPParms(), 3);
1172f0d755dSdiggerlin 
1182f0d755dSdiggerlin   ASSERT_TRUE(TT.getParmsType());
119d152e50cSKazu Hirata   EXPECT_EQ(*TT.getParmsType(), "i, i, f, f, d");
1202f0d755dSdiggerlin 
1212f0d755dSdiggerlin   V[8] = 0xAC;
1222f0d755dSdiggerlin   Size = sizeof(V);
1232f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr1 = XCOFFTracebackTable::create(V, Size);
1242f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr1, Succeeded());
1252f0d755dSdiggerlin   XCOFFTracebackTable TT1 = *TTOrErr1;
1262f0d755dSdiggerlin   ASSERT_TRUE(TT1.getParmsType());
127d152e50cSKazu Hirata   EXPECT_EQ(*TT1.getParmsType(), "f, f, d, i, i");
1282f0d755dSdiggerlin 
1292f0d755dSdiggerlin   V[8] = 0xD4;
1302f0d755dSdiggerlin   Size = sizeof(V);
1312f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr2 = XCOFFTracebackTable::create(V, Size);
1322f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr2, Succeeded());
1332f0d755dSdiggerlin   XCOFFTracebackTable TT2 = *TTOrErr2;
1342f0d755dSdiggerlin   ASSERT_TRUE(TT2.getParmsType());
135d152e50cSKazu Hirata   EXPECT_EQ(*TT2.getParmsType(), "d, i, f, f, i");
1362f0d755dSdiggerlin 
1372f0d755dSdiggerlin   V[6] = 0x01;
1382f0d755dSdiggerlin   Size = sizeof(V);
1392f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr3 = XCOFFTracebackTable::create(V, Size);
1402f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr3, Succeeded());
1412f0d755dSdiggerlin   XCOFFTracebackTable TT3 = *TTOrErr3;
1422f0d755dSdiggerlin   ASSERT_TRUE(TT3.getParmsType());
143d152e50cSKazu Hirata   EXPECT_EQ(*TT3.getParmsType(), "d, i, f, f");
1447ed515d1Szhijian 
1457ed515d1Szhijian   V[6] = 0x04;
1467ed515d1Szhijian   V[7] = 0x1E;
1477ed515d1Szhijian   V[8] = 0xAC;
1487ed515d1Szhijian   V[9] = 0xAA;
1497ed515d1Szhijian   V[10] = 0xAA;
1507ed515d1Szhijian   V[11] = 0xAA;
1517ed515d1Szhijian   Size = sizeof(V);
1527ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr4 = XCOFFTracebackTable::create(V, Size);
1537ed515d1Szhijian   ASSERT_THAT_EXPECTED(TTOrErr4, Succeeded());
1547ed515d1Szhijian   XCOFFTracebackTable TT4 = *TTOrErr4;
1557ed515d1Szhijian   ASSERT_TRUE(TT4.getParmsType());
156d152e50cSKazu Hirata   EXPECT_EQ(*TT4.getParmsType(),
1577ed515d1Szhijian             "f, f, d, i, i, f, f, f, f, f, f, f, f, f, f, f, f, ...");
1582f0d755dSdiggerlin }
1592f0d755dSdiggerlin 
160ab77fa51Sdiggerlin const uint8_t TBTableData[] = {
161ab77fa51Sdiggerlin     0x00, 0x00, 0x2A, 0x60, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc4, 0x00, 0x00,
162ab77fa51Sdiggerlin     0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x00, 0x00,
163ab77fa51Sdiggerlin     0x06, 0x06, 0x00, 0x00, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c,
164ab77fa51Sdiggerlin     0x6c, 0x1f, 0x02, 0x05, 0xf0, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
1652f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIControlledStorageInfoDisp)1662f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIControlledStorageInfoDisp) {
167ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
1682f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
1692f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
1702f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
1712f0d755dSdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
1722f0d755dSdiggerlin   EXPECT_TRUE(TT.hasControlledStorage());
1732f0d755dSdiggerlin   ASSERT_TRUE(TT.getNumOfCtlAnchors());
174*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getNumOfCtlAnchors().value(), 2u);
1752f0d755dSdiggerlin 
1762f0d755dSdiggerlin   ASSERT_TRUE(TT.getControlledStorageInfoDisp());
1772f0d755dSdiggerlin 
178*611ffcf4SKazu Hirata   SmallVector<uint32_t, 8> Disp = TT.getControlledStorageInfoDisp().value();
1792f0d755dSdiggerlin 
1801bf07324SEric Christopher   ASSERT_EQ(Disp.size(), 2UL);
1812f0d755dSdiggerlin   EXPECT_EQ(Disp[0], 0x05050000u);
1822f0d755dSdiggerlin   EXPECT_EQ(Disp[1], 0x06060000u);
183ab77fa51Sdiggerlin   EXPECT_EQ(Size, 45u);
184ab77fa51Sdiggerlin }
185ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIAllocaRegister)186ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIAllocaRegister) {
187ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
188ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
189ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
190ab77fa51Sdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
191ab77fa51Sdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
192ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getAllocaRegister());
193d152e50cSKazu Hirata   EXPECT_EQ(*TT.getAllocaRegister(), 31u);
1942f0d755dSdiggerlin }
1952f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIHasVectorInfo)1962f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIHasVectorInfo) {
197ab77fa51Sdiggerlin 
198ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
1992f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2002f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2012f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
2022f0d755dSdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
2032f0d755dSdiggerlin 
204ab77fa51Sdiggerlin   EXPECT_EQ(TT.getNumberOfFixedParms(), 3);
205ab77fa51Sdiggerlin   EXPECT_EQ(TT.getNumberOfFPParms(), 2);
2062f0d755dSdiggerlin   EXPECT_TRUE(TT.hasVectorInfo());
207ab77fa51Sdiggerlin   EXPECT_TRUE(TT.hasExtensionTable());
208ab77fa51Sdiggerlin 
209ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getParmsType());
210*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getParmsType().value(), "v, i, f, i, d, i, v");
211ab77fa51Sdiggerlin 
212ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getVectorExt());
213*611ffcf4SKazu Hirata   TBVectorExt VecExt = TT.getVectorExt().value();
214ab77fa51Sdiggerlin 
21585177965Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVRSaved(), 0);
216ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.isVRSavedOnStack());
217ab77fa51Sdiggerlin   EXPECT_FALSE(VecExt.hasVarArgs());
218ab77fa51Sdiggerlin 
219ab77fa51Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVectorParms(), 2u);
220ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.hasVMXInstruction());
221ab77fa51Sdiggerlin 
2227ed515d1Szhijian   EXPECT_EQ(VecExt.getVectorParmsInfo(), "vf, vf");
223ab77fa51Sdiggerlin 
224ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getExtensionTable());
225d152e50cSKazu Hirata   EXPECT_EQ(*TT.getExtensionTable(), ExtendedTBTableFlag::TB_SSP_CANARY);
226ab77fa51Sdiggerlin 
227ab77fa51Sdiggerlin   EXPECT_EQ(Size, 45u);
228ab77fa51Sdiggerlin }
229ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIHasVectorInfo1)230ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIHasVectorInfo1) {
231ab77fa51Sdiggerlin   const uint8_t TBTableData[] = {
2327ed515d1Szhijian       0x00, 0x00, 0x2A, 0x40, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc5, 0x00, 0x00,
233ab77fa51Sdiggerlin       0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x00, 0x00,
234ab77fa51Sdiggerlin       0x06, 0x06, 0x00, 0x00, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c,
235ab77fa51Sdiggerlin       0x6c, 0x11, 0x07, 0x90, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
236ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
237ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
238ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
239ab77fa51Sdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
240ab77fa51Sdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
241ab77fa51Sdiggerlin 
242ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getParmsType());
243*611ffcf4SKazu Hirata   EXPECT_EQ(TT.getParmsType().value(), "v, i, f, i, d, i, v, v");
244ab77fa51Sdiggerlin 
245ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getVectorExt());
246*611ffcf4SKazu Hirata   TBVectorExt VecExt = TT.getVectorExt().value();
247ab77fa51Sdiggerlin 
24885177965Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVRSaved(), 4);
249ab77fa51Sdiggerlin   EXPECT_FALSE(VecExt.isVRSavedOnStack());
250ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.hasVarArgs());
251ab77fa51Sdiggerlin 
252ab77fa51Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVectorParms(), 3u);
253ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.hasVMXInstruction());
254ab77fa51Sdiggerlin 
2557ed515d1Szhijian   EXPECT_EQ(VecExt.getVectorParmsInfo(), "vi, vs, vc");
256ab77fa51Sdiggerlin 
257ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getExtensionTable());
258d152e50cSKazu Hirata   EXPECT_EQ(*TT.getExtensionTable(), ExtendedTBTableFlag::TB_SSP_CANARY);
259ab77fa51Sdiggerlin 
260ab77fa51Sdiggerlin   EXPECT_EQ(Size, 44u);
2612f0d755dSdiggerlin }
2622f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtMandatory)2632f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtMandatory) {
2642f0d755dSdiggerlin   uint64_t Size = 6;
2652f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2662f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2672f0d755dSdiggerlin   EXPECT_THAT_ERROR(
2682f0d755dSdiggerlin       TTOrErr.takeError(),
2692f0d755dSdiggerlin       FailedWithMessage(
2702f0d755dSdiggerlin           "unexpected end of data at offset 0x6 while reading [0x0, 0x8)"));
271ab77fa51Sdiggerlin   EXPECT_EQ(Size, 0u);
2722f0d755dSdiggerlin }
2732f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtParmsType)2742f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtParmsType) {
2752f0d755dSdiggerlin   uint64_t Size = 9;
2762f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2772f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2782f0d755dSdiggerlin   EXPECT_THAT_ERROR(
2792f0d755dSdiggerlin       TTOrErr.takeError(),
2802f0d755dSdiggerlin       FailedWithMessage(
2812f0d755dSdiggerlin           "unexpected end of data at offset 0x9 while reading [0x8, 0xc)"));
2822f0d755dSdiggerlin   EXPECT_EQ(Size, 8u);
2832f0d755dSdiggerlin }
2842f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtTBOffset)2852f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtTBOffset) {
2862f0d755dSdiggerlin   uint64_t Size = 14;
2872f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2882f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2892f0d755dSdiggerlin   EXPECT_THAT_ERROR(
2902f0d755dSdiggerlin       TTOrErr.takeError(),
2912f0d755dSdiggerlin       FailedWithMessage(
2922f0d755dSdiggerlin           "unexpected end of data at offset 0xe while reading [0xc, 0x10)"));
2932f0d755dSdiggerlin   EXPECT_EQ(Size, 12u);
2942f0d755dSdiggerlin }
2952f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtHandlerMask)2962f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtHandlerMask) {
2972f0d755dSdiggerlin   uint8_t V[] = {0x00, 0x00, 0x22, 0xC0, 0x80, 0x00, 0x01, 0x05, 0x58,
2982f0d755dSdiggerlin                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07};
2992f0d755dSdiggerlin   uint64_t Size = sizeof(V);
3002f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr = XCOFFTracebackTable::create(V, Size);
3012f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3022f0d755dSdiggerlin       TTOrErr.takeError(),
3032f0d755dSdiggerlin       FailedWithMessage(
3042f0d755dSdiggerlin           "unexpected end of data at offset 0x12 while reading [0x10, 0x14)"));
3052f0d755dSdiggerlin   EXPECT_EQ(Size, 16u);
3062f0d755dSdiggerlin }
3072f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtNumOfCtlAnchors)3082f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtNumOfCtlAnchors) {
3092f0d755dSdiggerlin   uint64_t Size = 19;
3102f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3112f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3122f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3132f0d755dSdiggerlin       TTOrErr.takeError(),
3142f0d755dSdiggerlin       FailedWithMessage(
3152f0d755dSdiggerlin           "unexpected end of data at offset 0x13 while reading [0x10, 0x14)"));
3162f0d755dSdiggerlin   EXPECT_EQ(Size, 16u);
3172f0d755dSdiggerlin }
3182f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtControlledStorageInfoDisp)3192f0d755dSdiggerlin TEST(XCOFFObjectFileTest,
3202f0d755dSdiggerlin      XCOFFTracebackTableTruncatedAtControlledStorageInfoDisp) {
3212f0d755dSdiggerlin   uint64_t Size = 21;
3222f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3232f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3242f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3252f0d755dSdiggerlin       TTOrErr.takeError(),
3262f0d755dSdiggerlin       FailedWithMessage(
3272f0d755dSdiggerlin           "unexpected end of data at offset 0x15 while reading [0x14, 0x18)"));
3282f0d755dSdiggerlin   EXPECT_EQ(Size, 20u);
3292f0d755dSdiggerlin }
3302f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtNameLen)3312f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtNameLen) {
3322f0d755dSdiggerlin   uint64_t Size = 29;
3332f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3342f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3352f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3362f0d755dSdiggerlin       TTOrErr.takeError(),
3372f0d755dSdiggerlin       FailedWithMessage(
3382f0d755dSdiggerlin           "unexpected end of data at offset 0x1d while reading [0x1c, 0x1e)"));
3392f0d755dSdiggerlin   EXPECT_EQ(Size, 28u);
3402f0d755dSdiggerlin }
3412f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtFunctionName)3422f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtFunctionName) {
3432f0d755dSdiggerlin   uint64_t Size = 36;
3442f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3452f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3462f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3472f0d755dSdiggerlin       TTOrErr.takeError(),
3482f0d755dSdiggerlin       FailedWithMessage(
3492f0d755dSdiggerlin           "unexpected end of data at offset 0x24 while reading [0x1e, 0x25)"));
3502f0d755dSdiggerlin   EXPECT_EQ(Size, 30u);
3512f0d755dSdiggerlin }
3522f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtAllocaUsed)3532f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtAllocaUsed) {
354ab77fa51Sdiggerlin   uint64_t Size = 37;
355ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
356ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3572f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3582f0d755dSdiggerlin       TTOrErr.takeError(),
3592f0d755dSdiggerlin       FailedWithMessage(
3602f0d755dSdiggerlin           "unexpected end of data at offset 0x25 while reading [0x25, 0x26)"));
3612f0d755dSdiggerlin   EXPECT_EQ(Size, 37u);
3622f0d755dSdiggerlin }
363ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtVectorInfoData)364ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtVectorInfoData) {
365ab77fa51Sdiggerlin   uint64_t Size = 39;
366ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
367ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
368ab77fa51Sdiggerlin 
369ab77fa51Sdiggerlin   EXPECT_THAT_ERROR(
370ab77fa51Sdiggerlin       TTOrErr.takeError(),
371ab77fa51Sdiggerlin       FailedWithMessage(
372ab77fa51Sdiggerlin           "unexpected end of data at offset 0x27 while reading [0x26, 0x2c)"));
373ab77fa51Sdiggerlin   EXPECT_EQ(Size, 38u);
374ab77fa51Sdiggerlin }
375ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtVectorInfoParmsInfo)376ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtVectorInfoParmsInfo) {
377ab77fa51Sdiggerlin   uint64_t Size = 43;
378ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
379ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
380ab77fa51Sdiggerlin 
381ab77fa51Sdiggerlin   EXPECT_THAT_ERROR(
382ab77fa51Sdiggerlin       TTOrErr.takeError(),
383ab77fa51Sdiggerlin       FailedWithMessage(
384ab77fa51Sdiggerlin           "unexpected end of data at offset 0x2b while reading [0x26, 0x2c)"));
385ab77fa51Sdiggerlin   EXPECT_EQ(Size, 38u);
386ab77fa51Sdiggerlin }
387ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtExtLongTBTable)388ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtExtLongTBTable) {
389ab77fa51Sdiggerlin   uint64_t Size = 44;
390ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
391ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
392ab77fa51Sdiggerlin 
393ab77fa51Sdiggerlin   EXPECT_THAT_ERROR(
394ab77fa51Sdiggerlin       TTOrErr.takeError(),
395ab77fa51Sdiggerlin       FailedWithMessage(
396ab77fa51Sdiggerlin           "unexpected end of data at offset 0x2c while reading [0x2c, 0x2d)"));
397ab77fa51Sdiggerlin   EXPECT_EQ(Size, 44u);
398ab77fa51Sdiggerlin }
3998e84311aSjasonliu 
TEST(XCOFFObjectFileTest,XCOFFGetCsectAuxRef32)4008e84311aSjasonliu TEST(XCOFFObjectFileTest, XCOFFGetCsectAuxRef32) {
4018e84311aSjasonliu   uint8_t XCOFF32Binary[] = {
4028e84311aSjasonliu       // File header.
4038e84311aSjasonliu       0x01, 0xdf, 0x00, 0x01, 0x5f, 0x58, 0xf8, 0x95, 0x00, 0x00, 0x00, 0x3c,
4048e84311aSjasonliu       0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
4058e84311aSjasonliu 
4068e84311aSjasonliu       // Section header for empty .data section.
4078e84311aSjasonliu       0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4088e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4098e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4108e84311aSjasonliu       0x00, 0x00, 0x00, 0x40,
4118e84311aSjasonliu 
4128e84311aSjasonliu       // Start of symbol table.
4138e84311aSjasonliu       // C_File symbol.
4148e84311aSjasonliu       0x2e, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4158e84311aSjasonliu       0xff, 0xfe, 0x00, 0x03, 0x67, 0x01,
4168e84311aSjasonliu       // File Auxiliary Entry.
4178e84311aSjasonliu       0x61, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4188e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4198e84311aSjasonliu 
4208e84311aSjasonliu       // Csect symbol.
4218e84311aSjasonliu       0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4228e84311aSjasonliu       0x00, 0x01, 0x00, 0x00, 0x6b, 0x01,
4238e84311aSjasonliu       // Csect auxiliary entry.
4248e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x05,
4258e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
4268e84311aSjasonliu 
4278e84311aSjasonliu   ArrayRef<uint8_t> XCOFF32Ref(XCOFF32Binary, sizeof(XCOFF32Binary));
4288e84311aSjasonliu   Expected<std::unique_ptr<ObjectFile>> XCOFFObjOrErr =
4298e84311aSjasonliu       object::ObjectFile::createObjectFile(
4308e84311aSjasonliu           MemoryBufferRef(toStringRef(XCOFF32Ref), "dummyXCOFF"),
4318e84311aSjasonliu           file_magic::xcoff_object_32);
4328e84311aSjasonliu   ASSERT_THAT_EXPECTED(XCOFFObjOrErr, Succeeded());
4338e84311aSjasonliu 
4348e84311aSjasonliu   const XCOFFObjectFile &File = *cast<XCOFFObjectFile>((*XCOFFObjOrErr).get());
4358e84311aSjasonliu   DataRefImpl Ref;
4368e84311aSjasonliu   Ref.p = File.getSymbolEntryAddressByIndex(2);
4378e84311aSjasonliu   XCOFFSymbolRef SymRef = File.toSymbolRef(Ref);
4388e84311aSjasonliu   Expected<XCOFFCsectAuxRef> CsectRefOrErr = SymRef.getXCOFFCsectAuxRef();
4398e84311aSjasonliu   ASSERT_THAT_EXPECTED(CsectRefOrErr, Succeeded());
4408e84311aSjasonliu 
4418e84311aSjasonliu   // Set csect symbol's auxiliary entry count to 0.
4428e84311aSjasonliu   XCOFF32Binary[113] = 0;
4438e84311aSjasonliu   Expected<XCOFFCsectAuxRef> ExpectErr = SymRef.getXCOFFCsectAuxRef();
4448e84311aSjasonliu   EXPECT_THAT_ERROR(
4458e84311aSjasonliu       ExpectErr.takeError(),
446a00ff716SEsme-Yi       FailedWithMessage(
447a00ff716SEsme-Yi           "csect symbol \".data\" with index 2 contains no auxiliary entry"));
4488e84311aSjasonliu }
4498e84311aSjasonliu 
TEST(XCOFFObjectFileTest,XCOFFGetCsectAuxRef64)4508e84311aSjasonliu TEST(XCOFFObjectFileTest, XCOFFGetCsectAuxRef64) {
4518e84311aSjasonliu   uint8_t XCOFF64Binary[] = {
4528e84311aSjasonliu       // File header.
4538e84311aSjasonliu       0x01, 0xf7, 0x00, 0x01, 0x5f, 0x59, 0x25, 0xeb, 0x00, 0x00, 0x00, 0x00,
4548e84311aSjasonliu       0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
4558e84311aSjasonliu 
4568e84311aSjasonliu       // Section header for empty .data section.
4578e84311aSjasonliu       0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4588e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4598e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4608e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4618e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4628e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
4638e84311aSjasonliu 
4648e84311aSjasonliu       // Start of symbol table.
4658e84311aSjasonliu       // C_File symbol.
4668e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
4678e84311aSjasonliu       0xff, 0xfe, 0x00, 0x02, 0x67, 0x01,
4688e84311aSjasonliu       // File Auxiliary Entry.
4698e84311aSjasonliu       0x61, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4708e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
4718e84311aSjasonliu 
4728e84311aSjasonliu       // Csect symbol.
4738e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
4748e84311aSjasonliu       0x00, 0x01, 0x00, 0x00, 0x6b, 0x01,
4758e84311aSjasonliu       // Csect auxiliary entry.
4768e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x05,
4778e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0xfb,
4788e84311aSjasonliu 
4798e84311aSjasonliu       // String table.
4808e84311aSjasonliu       0x00, 0x00, 0x00, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x2e, 0x64,
4818e84311aSjasonliu       0x61, 0x74, 0x61, 0x00};
4828e84311aSjasonliu 
4838e84311aSjasonliu   ArrayRef<uint8_t> XCOFF64Ref(XCOFF64Binary, sizeof(XCOFF64Binary));
4848e84311aSjasonliu   Expected<std::unique_ptr<ObjectFile>> XCOFFObjOrErr =
4858e84311aSjasonliu       object::ObjectFile::createObjectFile(
4868e84311aSjasonliu           MemoryBufferRef(toStringRef(XCOFF64Ref), "dummyXCOFF"),
4878e84311aSjasonliu           file_magic::xcoff_object_64);
4888e84311aSjasonliu   ASSERT_THAT_EXPECTED(XCOFFObjOrErr, Succeeded());
4898e84311aSjasonliu 
4908e84311aSjasonliu   const XCOFFObjectFile &File = *cast<XCOFFObjectFile>((*XCOFFObjOrErr).get());
4918e84311aSjasonliu   DataRefImpl Ref;
4928e84311aSjasonliu   Ref.p = File.getSymbolEntryAddressByIndex(2);
4938e84311aSjasonliu   XCOFFSymbolRef SymRef = File.toSymbolRef(Ref);
4948e84311aSjasonliu   Expected<XCOFFCsectAuxRef> CsectRefOrErr = SymRef.getXCOFFCsectAuxRef();
4958e84311aSjasonliu   ASSERT_THAT_EXPECTED(CsectRefOrErr, Succeeded());
4968e84311aSjasonliu 
4978e84311aSjasonliu   // Inject incorrect auxiliary type value.
4988e84311aSjasonliu   XCOFF64Binary[167] = static_cast<uint8_t>(XCOFF::AUX_SYM);
4998e84311aSjasonliu   Expected<XCOFFCsectAuxRef> NotFoundErr = SymRef.getXCOFFCsectAuxRef();
5008e84311aSjasonliu   EXPECT_THAT_ERROR(
5018e84311aSjasonliu       NotFoundErr.takeError(),
502a00ff716SEsme-Yi       FailedWithMessage("a csect auxiliary entry has not been found for symbol "
503a00ff716SEsme-Yi                         "\".data\" with index 2"));
5048e84311aSjasonliu 
5058e84311aSjasonliu   // Set csect symbol's auxiliary entry count to 0.
5068e84311aSjasonliu   XCOFF64Binary[149] = 0;
5078e84311aSjasonliu   Expected<XCOFFCsectAuxRef> ExpectErr = SymRef.getXCOFFCsectAuxRef();
5088e84311aSjasonliu   EXPECT_THAT_ERROR(
5098e84311aSjasonliu       ExpectErr.takeError(),
510a00ff716SEsme-Yi       FailedWithMessage(
511a00ff716SEsme-Yi           "csect symbol \".data\" with index 2 contains no auxiliary entry"));
5128e84311aSjasonliu }
5137ed515d1Szhijian 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableErrorAtParameterType)5147ed515d1Szhijian TEST(XCOFFObjectFileTest, XCOFFTracebackTableErrorAtParameterType) {
5157ed515d1Szhijian   const uint8_t TBTableData[] = {0x00, 0x00, 0x22, 0x40, 0x80, 0x00, 0x01,
5167ed515d1Szhijian                                  0x05, 0x58, 0x00, 0x10, 0x00, 0x00, 0x00,
5177ed515d1Szhijian                                  0x00, 0x40, 0x00, 0x07, 0x61, 0x64, 0x64,
5187ed515d1Szhijian                                  0x5f, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00};
5197ed515d1Szhijian   uint64_t Size = 28;
5207ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr =
5217ed515d1Szhijian       XCOFFTracebackTable::create(TBTableData, Size);
5227ed515d1Szhijian 
5237ed515d1Szhijian   EXPECT_THAT_ERROR(
5247ed515d1Szhijian       TTOrErr.takeError(),
5257ed515d1Szhijian       FailedWithMessage("ParmsType encodes can not map to ParmsNum parameters "
5267ed515d1Szhijian                         "in parseParmsType."));
5277ed515d1Szhijian }
5287ed515d1Szhijian 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableErrorAtParameterTypeWithVecInfo)5297ed515d1Szhijian TEST(XCOFFObjectFileTest, XCOFFTracebackTableErrorAtParameterTypeWithVecInfo) {
5307ed515d1Szhijian   const uint8_t TBTableData[] = {
5317ed515d1Szhijian       0x00, 0x00, 0x2A, 0x40, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc0, 0x00, 0x10,
5327ed515d1Szhijian       0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x00, 0x00,
5337ed515d1Szhijian       0x06, 0x06, 0x00, 0x00, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c,
5347ed515d1Szhijian       0x6c, 0x11, 0x07, 0x90, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
5357ed515d1Szhijian   uint64_t Size = 44;
5367ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr =
5377ed515d1Szhijian       XCOFFTracebackTable::create(TBTableData, Size);
5387ed515d1Szhijian 
5397ed515d1Szhijian   EXPECT_THAT_ERROR(
5407ed515d1Szhijian       TTOrErr.takeError(),
5417ed515d1Szhijian       FailedWithMessage("ParmsType encodes can not map to ParmsNum parameters "
5427ed515d1Szhijian                         "in parseParmsTypeWithVecInfo."));
5437ed515d1Szhijian }
5447ed515d1Szhijian 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableErrorAtVecParameterType)5457ed515d1Szhijian TEST(XCOFFObjectFileTest, XCOFFTracebackTableErrorAtVecParameterType) {
5467ed515d1Szhijian   const uint8_t TBTableData[] = {
5477ed515d1Szhijian       0x00, 0x00, 0x2A, 0x40, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc0, 0x00, 0x00,
5487ed515d1Szhijian       0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x05, 0x05, 0x00, 0x00,
5497ed515d1Szhijian       0x06, 0x06, 0x00, 0x00, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c,
5507ed515d1Szhijian       0x6c, 0x11, 0x07, 0x90, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00};
5517ed515d1Szhijian   uint64_t Size = 44;
5527ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr =
5537ed515d1Szhijian       XCOFFTracebackTable::create(TBTableData, Size);
5547ed515d1Szhijian 
5557ed515d1Szhijian   EXPECT_THAT_ERROR(TTOrErr.takeError(),
5567ed515d1Szhijian                     FailedWithMessage("ParmsType encodes more than ParmsNum "
5577ed515d1Szhijian                                       "parameters in parseVectorParmsType."));
5587ed515d1Szhijian }
559