aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/XCOFFObjectFile.cpp
diff options
context:
space:
mode:
authorzhijian <zhijian@ca.ibm.com>2022-11-21 10:11:12 -0500
committerzhijian <zhijian@ca.ibm.com>2022-11-21 10:11:12 -0500
commita56d0e84dacea51e80981a731182a89ea0289947 (patch)
treed984fbfa15e694b149334fcb1154450fa57c05cd /llvm/lib/Object/XCOFFObjectFile.cpp
parentc7a53421cd57cfc6c8b7e60330b93b7063720f7d (diff)
downloadllvm-a56d0e84dacea51e80981a731182a89ea0289947.zip
llvm-a56d0e84dacea51e80981a731182a89ea0289947.tar.gz
llvm-a56d0e84dacea51e80981a731182a89ea0289947.tar.bz2
[XCOFF] llvm-readobj support display symbol table of loader section of xcoff object file.
Reviewers: James Henderson, Esme Yi Differential Revision: https://reviews.llvm.org/D135887
Diffstat (limited to 'llvm/lib/Object/XCOFFObjectFile.cpp')
-rw-r--r--llvm/lib/Object/XCOFFObjectFile.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp
index c758e35..061c47d 100644
--- a/llvm/lib/Object/XCOFFObjectFile.cpp
+++ b/llvm/lib/Object/XCOFFObjectFile.cpp
@@ -89,6 +89,34 @@ uint8_t XCOFFRelocation<AddressType>::getRelocatedLength() const {
template struct ExceptionSectionEntry<support::ubig32_t>;
template struct ExceptionSectionEntry<support::ubig64_t>;
+template <typename T>
+Expected<StringRef> getLoaderSecSymNameInStrTbl(const T *LoaderSecHeader,
+ uint64_t Offset) {
+ if (LoaderSecHeader->LengthOfStrTbl > Offset)
+ return (reinterpret_cast<const char *>(LoaderSecHeader) +
+ LoaderSecHeader->OffsetToStrTbl + Offset);
+
+ return createError("entry with offset 0x" + Twine::utohexstr(Offset) +
+ " in the loader section's string table with size 0x" +
+ Twine::utohexstr(LoaderSecHeader->LengthOfStrTbl) +
+ " is invalid");
+}
+
+Expected<StringRef> LoaderSectionSymbolEntry32::getSymbolName(
+ const LoaderSectionHeader32 *LoaderSecHeader32) const {
+ const NameOffsetInStrTbl *NameInStrTbl =
+ reinterpret_cast<const NameOffsetInStrTbl *>(SymbolName);
+ if (NameInStrTbl->IsNameInStrTbl != XCOFFSymbolRef::NAME_IN_STR_TBL_MAGIC)
+ return generateXCOFFFixedNameStringRef(SymbolName);
+
+ return getLoaderSecSymNameInStrTbl(LoaderSecHeader32, NameInStrTbl->Offset);
+}
+
+Expected<StringRef> LoaderSectionSymbolEntry64::getSymbolName(
+ const LoaderSectionHeader64 *LoaderSecHeader64) const {
+ return getLoaderSecSymNameInStrTbl(LoaderSecHeader64, Offset);
+}
+
uintptr_t
XCOFFObjectFile::getAdvancedSymbolEntryAddress(uintptr_t CurrentAddress,
uint32_t Distance) {