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