diff options
author | zhijian <zhijian@ca.ibm.com> | 2023-07-06 11:47:08 -0400 |
---|---|---|
committer | zhijian <zhijian@ca.ibm.com> | 2023-07-06 11:47:08 -0400 |
commit | d6d7f7b1d2639a06002779aed5dccf53fee20c6e (patch) | |
tree | 762b847fb46b4b1c0b4f2f3fce74677d41d784df /llvm/lib/Object/XCOFFObjectFile.cpp | |
parent | 071c8a41ccbb10e88870345445db671c183a346e (diff) | |
download | llvm-d6d7f7b1d2639a06002779aed5dccf53fee20c6e.zip llvm-d6d7f7b1d2639a06002779aed5dccf53fee20c6e.tar.gz llvm-d6d7f7b1d2639a06002779aed5dccf53fee20c6e.tar.bz2 |
[AIX][XCOFF] print out the traceback info
Summary:
Adding a new option -traceback-table to print out the traceback info of xcoff ojbect file.
Reviewers: James Henderson, Fangrui Song, Stephen Peckham, Xing Xue
Differential Revision: https://reviews.llvm.org/D89049
Diffstat (limited to 'llvm/lib/Object/XCOFFObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/XCOFFObjectFile.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index ef134de..b6d0180 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -1394,18 +1394,18 @@ bool TBVectorExt::hasVMXInstruction() const { #undef GETVALUEWITHMASK #undef GETVALUEWITHMASKSHIFT -Expected<XCOFFTracebackTable> XCOFFTracebackTable::create(const uint8_t *Ptr, - uint64_t &Size) { +Expected<XCOFFTracebackTable> +XCOFFTracebackTable::create(const uint8_t *Ptr, uint64_t &Size, bool Is64Bit) { Error Err = Error::success(); - XCOFFTracebackTable TBT(Ptr, Size, Err); + XCOFFTracebackTable TBT(Ptr, Size, Err, Is64Bit); if (Err) return std::move(Err); return TBT; } XCOFFTracebackTable::XCOFFTracebackTable(const uint8_t *Ptr, uint64_t &Size, - Error &Err) - : TBPtr(Ptr) { + Error &Err, bool Is64Bit) + : TBPtr(Ptr), Is64BitObj(Is64Bit) { ErrorAsOutParameter EAO(&Err); DataExtractor DE(ArrayRef<uint8_t>(Ptr, Size), /*IsLittleEndian=*/false, /*AddressSize=*/0); @@ -1460,6 +1460,8 @@ XCOFFTracebackTable::XCOFFTracebackTable(const uint8_t *Ptr, uint64_t &Size, } VecExt = TBVecExtOrErr.get(); VectorParmsNum = VecExt->getNumberOfVectorParms(); + // Skip two bytes of padding after vector info. + DE.skip(Cur, 2); } } @@ -1480,9 +1482,15 @@ XCOFFTracebackTable::XCOFFTracebackTable(const uint8_t *Ptr, uint64_t &Size, ParmsType = ParmsTypeOrError.get(); } - if (Cur && hasExtensionTable()) + if (Cur && hasExtensionTable()) { ExtensionTable = DE.getU8(Cur); + if (*ExtensionTable & ExtendedTBTableFlag::TB_EH_INFO) { + // eh_info displacement must be 4-byte aligned. + Cur.seek(alignTo(Cur.tell(), 4)); + EhInfoDisp = Is64BitObj ? DE.getU64(Cur) : DE.getU32(Cur); + } + } if (!Cur) Err = Cur.takeError(); |