xref: /llvm-project/llvm/unittests/Object/XCOFFObjectFileTest.cpp (revision d6d7f7b1d2639a06002779aed5dccf53fee20c6e)
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());
8667ba5c50SFangrui Song   EXPECT_EQ(*TT.getParmsType(), "i, f, d");
872f0d755dSdiggerlin 
882f0d755dSdiggerlin   ASSERT_TRUE(TT.getTraceBackTableOffset());
8967ba5c50SFangrui Song   EXPECT_EQ(*TT.getTraceBackTableOffset(), 64u);
902f0d755dSdiggerlin 
912f0d755dSdiggerlin   EXPECT_FALSE(TT.getHandlerMask());
922f0d755dSdiggerlin 
932f0d755dSdiggerlin   ASSERT_TRUE(TT.getFunctionName());
9467ba5c50SFangrui Song   EXPECT_EQ(*TT.getFunctionName(), "add_all");
9567ba5c50SFangrui Song   EXPECT_EQ(TT.getFunctionName()->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[] = {
161*d6d7f7b1Szhijian     0x00, 0x00, 0x2A, 0x60, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc4,
162*d6d7f7b1Szhijian     0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02,
163*d6d7f7b1Szhijian     0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x07,
164*d6d7f7b1Szhijian     0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x1f, 0x02, 0x05,
165*d6d7f7b1Szhijian     0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
1662f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIControlledStorageInfoDisp)1672f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIControlledStorageInfoDisp) {
168ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
1692f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
1702f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
1712f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
1722f0d755dSdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
1732f0d755dSdiggerlin   EXPECT_TRUE(TT.hasControlledStorage());
1742f0d755dSdiggerlin   ASSERT_TRUE(TT.getNumOfCtlAnchors());
17567ba5c50SFangrui Song   EXPECT_EQ(*TT.getNumOfCtlAnchors(), 2u);
1762f0d755dSdiggerlin 
1772f0d755dSdiggerlin   ASSERT_TRUE(TT.getControlledStorageInfoDisp());
1782f0d755dSdiggerlin 
17967ba5c50SFangrui Song   SmallVector<uint32_t, 8> Disp = *TT.getControlledStorageInfoDisp();
1802f0d755dSdiggerlin 
1811bf07324SEric Christopher   ASSERT_EQ(Disp.size(), 2UL);
1822f0d755dSdiggerlin   EXPECT_EQ(Disp[0], 0x05050000u);
1832f0d755dSdiggerlin   EXPECT_EQ(Disp[1], 0x06060000u);
184*d6d7f7b1Szhijian   EXPECT_EQ(Size, 47u);
185ab77fa51Sdiggerlin }
186ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIAllocaRegister)187ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIAllocaRegister) {
188ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
189ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
190ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
191ab77fa51Sdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
192ab77fa51Sdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
193ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getAllocaRegister());
194d152e50cSKazu Hirata   EXPECT_EQ(*TT.getAllocaRegister(), 31u);
1952f0d755dSdiggerlin }
1962f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIHasVectorInfo)1972f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIHasVectorInfo) {
198ab77fa51Sdiggerlin 
199ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
2002f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2012f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2022f0d755dSdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
2032f0d755dSdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
2042f0d755dSdiggerlin 
205ab77fa51Sdiggerlin   EXPECT_EQ(TT.getNumberOfFixedParms(), 3);
206ab77fa51Sdiggerlin   EXPECT_EQ(TT.getNumberOfFPParms(), 2);
2072f0d755dSdiggerlin   EXPECT_TRUE(TT.hasVectorInfo());
208ab77fa51Sdiggerlin   EXPECT_TRUE(TT.hasExtensionTable());
209ab77fa51Sdiggerlin 
210ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getParmsType());
21167ba5c50SFangrui Song   EXPECT_EQ(*TT.getParmsType(), "v, i, f, i, d, i, v");
212ab77fa51Sdiggerlin 
213ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getVectorExt());
21467ba5c50SFangrui Song   TBVectorExt VecExt = *TT.getVectorExt();
215ab77fa51Sdiggerlin 
21685177965Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVRSaved(), 0);
217ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.isVRSavedOnStack());
218ab77fa51Sdiggerlin   EXPECT_FALSE(VecExt.hasVarArgs());
219ab77fa51Sdiggerlin 
220ab77fa51Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVectorParms(), 2u);
221ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.hasVMXInstruction());
222ab77fa51Sdiggerlin 
2237ed515d1Szhijian   EXPECT_EQ(VecExt.getVectorParmsInfo(), "vf, vf");
224ab77fa51Sdiggerlin 
225ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getExtensionTable());
226d152e50cSKazu Hirata   EXPECT_EQ(*TT.getExtensionTable(), ExtendedTBTableFlag::TB_SSP_CANARY);
227ab77fa51Sdiggerlin 
228*d6d7f7b1Szhijian   EXPECT_EQ(Size, 47u);
229ab77fa51Sdiggerlin }
230ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableAPIHasVectorInfo1)231ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableAPIHasVectorInfo1) {
232ab77fa51Sdiggerlin   const uint8_t TBTableData[] = {
233*d6d7f7b1Szhijian       0x00, 0x00, 0x2A, 0x40, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc5,
234*d6d7f7b1Szhijian       0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02,
235*d6d7f7b1Szhijian       0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x07,
236*d6d7f7b1Szhijian       0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x11, 0x07, 0x90,
237*d6d7f7b1Szhijian       0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
238ab77fa51Sdiggerlin   uint64_t Size = sizeof(TBTableData);
239ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
240ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
241ab77fa51Sdiggerlin   ASSERT_THAT_EXPECTED(TTOrErr, Succeeded());
242ab77fa51Sdiggerlin   XCOFFTracebackTable TT = *TTOrErr;
243ab77fa51Sdiggerlin 
244ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getParmsType());
24567ba5c50SFangrui Song   EXPECT_EQ(*TT.getParmsType(), "v, i, f, i, d, i, v, v");
246ab77fa51Sdiggerlin 
247ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getVectorExt());
24867ba5c50SFangrui Song   TBVectorExt VecExt = *TT.getVectorExt();
249ab77fa51Sdiggerlin 
25085177965Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVRSaved(), 4);
251ab77fa51Sdiggerlin   EXPECT_FALSE(VecExt.isVRSavedOnStack());
252ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.hasVarArgs());
253ab77fa51Sdiggerlin 
254ab77fa51Sdiggerlin   EXPECT_EQ(VecExt.getNumberOfVectorParms(), 3u);
255ab77fa51Sdiggerlin   EXPECT_TRUE(VecExt.hasVMXInstruction());
256ab77fa51Sdiggerlin 
2577ed515d1Szhijian   EXPECT_EQ(VecExt.getVectorParmsInfo(), "vi, vs, vc");
258ab77fa51Sdiggerlin 
259ab77fa51Sdiggerlin   ASSERT_TRUE(TT.getExtensionTable());
260d152e50cSKazu Hirata   EXPECT_EQ(*TT.getExtensionTable(), ExtendedTBTableFlag::TB_SSP_CANARY);
261ab77fa51Sdiggerlin 
262*d6d7f7b1Szhijian   EXPECT_EQ(Size, 46u);
2632f0d755dSdiggerlin }
2642f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtMandatory)2652f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtMandatory) {
2662f0d755dSdiggerlin   uint64_t Size = 6;
2672f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2682f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2692f0d755dSdiggerlin   EXPECT_THAT_ERROR(
2702f0d755dSdiggerlin       TTOrErr.takeError(),
2712f0d755dSdiggerlin       FailedWithMessage(
2722f0d755dSdiggerlin           "unexpected end of data at offset 0x6 while reading [0x0, 0x8)"));
273ab77fa51Sdiggerlin   EXPECT_EQ(Size, 0u);
2742f0d755dSdiggerlin }
2752f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtParmsType)2762f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtParmsType) {
2772f0d755dSdiggerlin   uint64_t Size = 9;
2782f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2792f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2802f0d755dSdiggerlin   EXPECT_THAT_ERROR(
2812f0d755dSdiggerlin       TTOrErr.takeError(),
2822f0d755dSdiggerlin       FailedWithMessage(
2832f0d755dSdiggerlin           "unexpected end of data at offset 0x9 while reading [0x8, 0xc)"));
2842f0d755dSdiggerlin   EXPECT_EQ(Size, 8u);
2852f0d755dSdiggerlin }
2862f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtTBOffset)2872f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtTBOffset) {
2882f0d755dSdiggerlin   uint64_t Size = 14;
2892f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
2902f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
2912f0d755dSdiggerlin   EXPECT_THAT_ERROR(
2922f0d755dSdiggerlin       TTOrErr.takeError(),
2932f0d755dSdiggerlin       FailedWithMessage(
2942f0d755dSdiggerlin           "unexpected end of data at offset 0xe while reading [0xc, 0x10)"));
2952f0d755dSdiggerlin   EXPECT_EQ(Size, 12u);
2962f0d755dSdiggerlin }
2972f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtHandlerMask)2982f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtHandlerMask) {
2992f0d755dSdiggerlin   uint8_t V[] = {0x00, 0x00, 0x22, 0xC0, 0x80, 0x00, 0x01, 0x05, 0x58,
3002f0d755dSdiggerlin                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07};
3012f0d755dSdiggerlin   uint64_t Size = sizeof(V);
3022f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr = XCOFFTracebackTable::create(V, Size);
3032f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3042f0d755dSdiggerlin       TTOrErr.takeError(),
3052f0d755dSdiggerlin       FailedWithMessage(
3062f0d755dSdiggerlin           "unexpected end of data at offset 0x12 while reading [0x10, 0x14)"));
3072f0d755dSdiggerlin   EXPECT_EQ(Size, 16u);
3082f0d755dSdiggerlin }
3092f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtNumOfCtlAnchors)3102f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtNumOfCtlAnchors) {
3112f0d755dSdiggerlin   uint64_t Size = 19;
3122f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3132f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3142f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3152f0d755dSdiggerlin       TTOrErr.takeError(),
3162f0d755dSdiggerlin       FailedWithMessage(
3172f0d755dSdiggerlin           "unexpected end of data at offset 0x13 while reading [0x10, 0x14)"));
3182f0d755dSdiggerlin   EXPECT_EQ(Size, 16u);
3192f0d755dSdiggerlin }
3202f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtControlledStorageInfoDisp)3212f0d755dSdiggerlin TEST(XCOFFObjectFileTest,
3222f0d755dSdiggerlin      XCOFFTracebackTableTruncatedAtControlledStorageInfoDisp) {
3232f0d755dSdiggerlin   uint64_t Size = 21;
3242f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3252f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3262f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3272f0d755dSdiggerlin       TTOrErr.takeError(),
3282f0d755dSdiggerlin       FailedWithMessage(
3292f0d755dSdiggerlin           "unexpected end of data at offset 0x15 while reading [0x14, 0x18)"));
3302f0d755dSdiggerlin   EXPECT_EQ(Size, 20u);
3312f0d755dSdiggerlin }
3322f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtNameLen)3332f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtNameLen) {
3342f0d755dSdiggerlin   uint64_t Size = 29;
3352f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3362f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3372f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3382f0d755dSdiggerlin       TTOrErr.takeError(),
3392f0d755dSdiggerlin       FailedWithMessage(
3402f0d755dSdiggerlin           "unexpected end of data at offset 0x1d while reading [0x1c, 0x1e)"));
3412f0d755dSdiggerlin   EXPECT_EQ(Size, 28u);
3422f0d755dSdiggerlin }
3432f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtFunctionName)3442f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtFunctionName) {
3452f0d755dSdiggerlin   uint64_t Size = 36;
3462f0d755dSdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
3472f0d755dSdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3482f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3492f0d755dSdiggerlin       TTOrErr.takeError(),
3502f0d755dSdiggerlin       FailedWithMessage(
3512f0d755dSdiggerlin           "unexpected end of data at offset 0x24 while reading [0x1e, 0x25)"));
3522f0d755dSdiggerlin   EXPECT_EQ(Size, 30u);
3532f0d755dSdiggerlin }
3542f0d755dSdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtAllocaUsed)3552f0d755dSdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtAllocaUsed) {
356ab77fa51Sdiggerlin   uint64_t Size = 37;
357ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
358ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
3592f0d755dSdiggerlin   EXPECT_THAT_ERROR(
3602f0d755dSdiggerlin       TTOrErr.takeError(),
3612f0d755dSdiggerlin       FailedWithMessage(
3622f0d755dSdiggerlin           "unexpected end of data at offset 0x25 while reading [0x25, 0x26)"));
3632f0d755dSdiggerlin   EXPECT_EQ(Size, 37u);
3642f0d755dSdiggerlin }
365ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtVectorInfoData)366ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtVectorInfoData) {
367ab77fa51Sdiggerlin   uint64_t Size = 39;
368ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
369ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
370ab77fa51Sdiggerlin 
371ab77fa51Sdiggerlin   EXPECT_THAT_ERROR(
372ab77fa51Sdiggerlin       TTOrErr.takeError(),
373ab77fa51Sdiggerlin       FailedWithMessage(
374ab77fa51Sdiggerlin           "unexpected end of data at offset 0x27 while reading [0x26, 0x2c)"));
375ab77fa51Sdiggerlin   EXPECT_EQ(Size, 38u);
376ab77fa51Sdiggerlin }
377ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtVectorInfoParmsInfo)378ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtVectorInfoParmsInfo) {
379ab77fa51Sdiggerlin   uint64_t Size = 43;
380ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
381ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
382ab77fa51Sdiggerlin 
383ab77fa51Sdiggerlin   EXPECT_THAT_ERROR(
384ab77fa51Sdiggerlin       TTOrErr.takeError(),
385ab77fa51Sdiggerlin       FailedWithMessage(
386ab77fa51Sdiggerlin           "unexpected end of data at offset 0x2b while reading [0x26, 0x2c)"));
387ab77fa51Sdiggerlin   EXPECT_EQ(Size, 38u);
388ab77fa51Sdiggerlin }
389ab77fa51Sdiggerlin 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableTruncatedAtExtLongTBTable)390ab77fa51Sdiggerlin TEST(XCOFFObjectFileTest, XCOFFTracebackTableTruncatedAtExtLongTBTable) {
391*d6d7f7b1Szhijian   uint64_t Size = 46;
392ab77fa51Sdiggerlin   Expected<XCOFFTracebackTable> TTOrErr =
393ab77fa51Sdiggerlin       XCOFFTracebackTable::create(TBTableData, Size);
394ab77fa51Sdiggerlin 
395ab77fa51Sdiggerlin   EXPECT_THAT_ERROR(
396ab77fa51Sdiggerlin       TTOrErr.takeError(),
397ab77fa51Sdiggerlin       FailedWithMessage(
398*d6d7f7b1Szhijian           "unexpected end of data at offset 0x2e while reading [0x2e, 0x2f)"));
399*d6d7f7b1Szhijian   EXPECT_EQ(Size, 46u);
400ab77fa51Sdiggerlin }
4018e84311aSjasonliu 
TEST(XCOFFObjectFileTest,XCOFFGetCsectAuxRef32)4028e84311aSjasonliu TEST(XCOFFObjectFileTest, XCOFFGetCsectAuxRef32) {
4038e84311aSjasonliu   uint8_t XCOFF32Binary[] = {
4048e84311aSjasonliu       // File header.
4058e84311aSjasonliu       0x01, 0xdf, 0x00, 0x01, 0x5f, 0x58, 0xf8, 0x95, 0x00, 0x00, 0x00, 0x3c,
4068e84311aSjasonliu       0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
4078e84311aSjasonliu 
4088e84311aSjasonliu       // Section header for empty .data section.
4098e84311aSjasonliu       0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4108e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4118e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4128e84311aSjasonliu       0x00, 0x00, 0x00, 0x40,
4138e84311aSjasonliu 
4148e84311aSjasonliu       // Start of symbol table.
4158e84311aSjasonliu       // C_File symbol.
4168e84311aSjasonliu       0x2e, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4178e84311aSjasonliu       0xff, 0xfe, 0x00, 0x03, 0x67, 0x01,
4188e84311aSjasonliu       // File Auxiliary Entry.
4198e84311aSjasonliu       0x61, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4208e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4218e84311aSjasonliu 
4228e84311aSjasonliu       // Csect symbol.
4238e84311aSjasonliu       0x2e, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4248e84311aSjasonliu       0x00, 0x01, 0x00, 0x00, 0x6b, 0x01,
4258e84311aSjasonliu       // Csect auxiliary entry.
4268e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x05,
4278e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
4288e84311aSjasonliu 
4298e84311aSjasonliu   ArrayRef<uint8_t> XCOFF32Ref(XCOFF32Binary, sizeof(XCOFF32Binary));
4308e84311aSjasonliu   Expected<std::unique_ptr<ObjectFile>> XCOFFObjOrErr =
4318e84311aSjasonliu       object::ObjectFile::createObjectFile(
4328e84311aSjasonliu           MemoryBufferRef(toStringRef(XCOFF32Ref), "dummyXCOFF"),
4338e84311aSjasonliu           file_magic::xcoff_object_32);
4348e84311aSjasonliu   ASSERT_THAT_EXPECTED(XCOFFObjOrErr, Succeeded());
4358e84311aSjasonliu 
4368e84311aSjasonliu   const XCOFFObjectFile &File = *cast<XCOFFObjectFile>((*XCOFFObjOrErr).get());
4378e84311aSjasonliu   DataRefImpl Ref;
4388e84311aSjasonliu   Ref.p = File.getSymbolEntryAddressByIndex(2);
4398e84311aSjasonliu   XCOFFSymbolRef SymRef = File.toSymbolRef(Ref);
4408e84311aSjasonliu   Expected<XCOFFCsectAuxRef> CsectRefOrErr = SymRef.getXCOFFCsectAuxRef();
4418e84311aSjasonliu   ASSERT_THAT_EXPECTED(CsectRefOrErr, Succeeded());
4428e84311aSjasonliu 
4438e84311aSjasonliu   // Set csect symbol's auxiliary entry count to 0.
4448e84311aSjasonliu   XCOFF32Binary[113] = 0;
4458e84311aSjasonliu   Expected<XCOFFCsectAuxRef> ExpectErr = SymRef.getXCOFFCsectAuxRef();
4468e84311aSjasonliu   EXPECT_THAT_ERROR(
4478e84311aSjasonliu       ExpectErr.takeError(),
448a00ff716SEsme-Yi       FailedWithMessage(
449a00ff716SEsme-Yi           "csect symbol \".data\" with index 2 contains no auxiliary entry"));
4508e84311aSjasonliu }
4518e84311aSjasonliu 
TEST(XCOFFObjectFileTest,XCOFFGetCsectAuxRef64)4528e84311aSjasonliu TEST(XCOFFObjectFileTest, XCOFFGetCsectAuxRef64) {
4538e84311aSjasonliu   uint8_t XCOFF64Binary[] = {
4548e84311aSjasonliu       // File header.
4558e84311aSjasonliu       0x01, 0xf7, 0x00, 0x01, 0x5f, 0x59, 0x25, 0xeb, 0x00, 0x00, 0x00, 0x00,
4568e84311aSjasonliu       0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
4578e84311aSjasonliu 
4588e84311aSjasonliu       // Section header for empty .data section.
4598e84311aSjasonliu       0x2e, 0x64, 0x61, 0x74, 0x61, 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, 0x00, 0x00, 0x00, 0x00, 0x00,
4638e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4648e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
4658e84311aSjasonliu 
4668e84311aSjasonliu       // Start of symbol table.
4678e84311aSjasonliu       // C_File symbol.
4688e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
4698e84311aSjasonliu       0xff, 0xfe, 0x00, 0x02, 0x67, 0x01,
4708e84311aSjasonliu       // File Auxiliary Entry.
4718e84311aSjasonliu       0x61, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
4728e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
4738e84311aSjasonliu 
4748e84311aSjasonliu       // Csect symbol.
4758e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
4768e84311aSjasonliu       0x00, 0x01, 0x00, 0x00, 0x6b, 0x01,
4778e84311aSjasonliu       // Csect auxiliary entry.
4788e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x05,
4798e84311aSjasonliu       0x00, 0x00, 0x00, 0x00, 0x00, 0xfb,
4808e84311aSjasonliu 
4818e84311aSjasonliu       // String table.
4828e84311aSjasonliu       0x00, 0x00, 0x00, 0x10, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x2e, 0x64,
4838e84311aSjasonliu       0x61, 0x74, 0x61, 0x00};
4848e84311aSjasonliu 
4858e84311aSjasonliu   ArrayRef<uint8_t> XCOFF64Ref(XCOFF64Binary, sizeof(XCOFF64Binary));
4868e84311aSjasonliu   Expected<std::unique_ptr<ObjectFile>> XCOFFObjOrErr =
4878e84311aSjasonliu       object::ObjectFile::createObjectFile(
4888e84311aSjasonliu           MemoryBufferRef(toStringRef(XCOFF64Ref), "dummyXCOFF"),
4898e84311aSjasonliu           file_magic::xcoff_object_64);
4908e84311aSjasonliu   ASSERT_THAT_EXPECTED(XCOFFObjOrErr, Succeeded());
4918e84311aSjasonliu 
4928e84311aSjasonliu   const XCOFFObjectFile &File = *cast<XCOFFObjectFile>((*XCOFFObjOrErr).get());
4938e84311aSjasonliu   DataRefImpl Ref;
4948e84311aSjasonliu   Ref.p = File.getSymbolEntryAddressByIndex(2);
4958e84311aSjasonliu   XCOFFSymbolRef SymRef = File.toSymbolRef(Ref);
4968e84311aSjasonliu   Expected<XCOFFCsectAuxRef> CsectRefOrErr = SymRef.getXCOFFCsectAuxRef();
4978e84311aSjasonliu   ASSERT_THAT_EXPECTED(CsectRefOrErr, Succeeded());
4988e84311aSjasonliu 
4998e84311aSjasonliu   // Inject incorrect auxiliary type value.
5008e84311aSjasonliu   XCOFF64Binary[167] = static_cast<uint8_t>(XCOFF::AUX_SYM);
5018e84311aSjasonliu   Expected<XCOFFCsectAuxRef> NotFoundErr = SymRef.getXCOFFCsectAuxRef();
5028e84311aSjasonliu   EXPECT_THAT_ERROR(
5038e84311aSjasonliu       NotFoundErr.takeError(),
504a00ff716SEsme-Yi       FailedWithMessage("a csect auxiliary entry has not been found for symbol "
505a00ff716SEsme-Yi                         "\".data\" with index 2"));
5068e84311aSjasonliu 
5078e84311aSjasonliu   // Set csect symbol's auxiliary entry count to 0.
5088e84311aSjasonliu   XCOFF64Binary[149] = 0;
5098e84311aSjasonliu   Expected<XCOFFCsectAuxRef> ExpectErr = SymRef.getXCOFFCsectAuxRef();
5108e84311aSjasonliu   EXPECT_THAT_ERROR(
5118e84311aSjasonliu       ExpectErr.takeError(),
512a00ff716SEsme-Yi       FailedWithMessage(
513a00ff716SEsme-Yi           "csect symbol \".data\" with index 2 contains no auxiliary entry"));
5148e84311aSjasonliu }
5157ed515d1Szhijian 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableErrorAtParameterType)5167ed515d1Szhijian TEST(XCOFFObjectFileTest, XCOFFTracebackTableErrorAtParameterType) {
5177ed515d1Szhijian   const uint8_t TBTableData[] = {0x00, 0x00, 0x22, 0x40, 0x80, 0x00, 0x01,
5187ed515d1Szhijian                                  0x05, 0x58, 0x00, 0x10, 0x00, 0x00, 0x00,
5197ed515d1Szhijian                                  0x00, 0x40, 0x00, 0x07, 0x61, 0x64, 0x64,
5207ed515d1Szhijian                                  0x5f, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00};
5217ed515d1Szhijian   uint64_t Size = 28;
5227ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr =
5237ed515d1Szhijian       XCOFFTracebackTable::create(TBTableData, Size);
5247ed515d1Szhijian 
5257ed515d1Szhijian   EXPECT_THAT_ERROR(
5267ed515d1Szhijian       TTOrErr.takeError(),
5277ed515d1Szhijian       FailedWithMessage("ParmsType encodes can not map to ParmsNum parameters "
5287ed515d1Szhijian                         "in parseParmsType."));
5297ed515d1Szhijian }
5307ed515d1Szhijian 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableErrorAtParameterTypeWithVecInfo)5317ed515d1Szhijian TEST(XCOFFObjectFileTest, XCOFFTracebackTableErrorAtParameterTypeWithVecInfo) {
5327ed515d1Szhijian   const uint8_t TBTableData[] = {
533*d6d7f7b1Szhijian       0x00, 0x00, 0x2A, 0x40, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc0,
534*d6d7f7b1Szhijian       0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02,
535*d6d7f7b1Szhijian       0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x07,
536*d6d7f7b1Szhijian       0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x11, 0x07, 0x90,
537*d6d7f7b1Szhijian       0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
538*d6d7f7b1Szhijian   uint64_t Size = 46;
5397ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr =
5407ed515d1Szhijian       XCOFFTracebackTable::create(TBTableData, Size);
5417ed515d1Szhijian 
5427ed515d1Szhijian   EXPECT_THAT_ERROR(
5437ed515d1Szhijian       TTOrErr.takeError(),
5447ed515d1Szhijian       FailedWithMessage("ParmsType encodes can not map to ParmsNum parameters "
5457ed515d1Szhijian                         "in parseParmsTypeWithVecInfo."));
5467ed515d1Szhijian }
5477ed515d1Szhijian 
TEST(XCOFFObjectFileTest,XCOFFTracebackTableErrorAtVecParameterType)5487ed515d1Szhijian TEST(XCOFFObjectFileTest, XCOFFTracebackTableErrorAtVecParameterType) {
5497ed515d1Szhijian   const uint8_t TBTableData[] = {
550*d6d7f7b1Szhijian       0x00, 0x00, 0x2A, 0x40, 0x80, 0xc0, 0x03, 0x05, 0x48, 0xc0,
551*d6d7f7b1Szhijian       0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02,
552*d6d7f7b1Szhijian       0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x07,
553*d6d7f7b1Szhijian       0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x11, 0x07, 0x90,
554*d6d7f7b1Szhijian       0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00};
555*d6d7f7b1Szhijian   uint64_t Size = 46;
5567ed515d1Szhijian   Expected<XCOFFTracebackTable> TTOrErr =
5577ed515d1Szhijian       XCOFFTracebackTable::create(TBTableData, Size);
5587ed515d1Szhijian 
5597ed515d1Szhijian   EXPECT_THAT_ERROR(TTOrErr.takeError(),
5607ed515d1Szhijian                     FailedWithMessage("ParmsType encodes more than ParmsNum "
5617ed515d1Szhijian                                       "parameters in parseVectorParmsType."));
5627ed515d1Szhijian }
563