[llvm] enable file-headers option of llvm-objdump for XCOFF object files (PR #96104)

zhijian lin via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 19 12:32:12 PDT 2024


https://github.com/diggerlin updated https://github.com/llvm/llvm-project/pull/96104

>From 7040bc2ddca4723edcecd02483902ef876ca66d0 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Wed, 19 Jun 2024 15:18:33 -0400
Subject: [PATCH 1/2] enable file-headers option of llvm-objdump for XCOFF
 object files

---
 llvm/include/llvm/Object/XCOFFObjectFile.h    |  3 +
 llvm/lib/Object/XCOFFObjectFile.cpp           |  8 ++-
 .../llvm-objdump/XCOFF/file-headers.test      | 56 +++++++++++++++++++
 llvm/tools/llvm-objdump/llvm-objdump.cpp      |  2 +-
 4 files changed, 65 insertions(+), 4 deletions(-)
 create mode 100644 llvm/test/tools/llvm-objdump/XCOFF/file-headers.test

diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h
index fa23aa9c5d3f4..5a7cd8e38f2b7 100644
--- a/llvm/include/llvm/Object/XCOFFObjectFile.h
+++ b/llvm/include/llvm/Object/XCOFFObjectFile.h
@@ -70,6 +70,9 @@ template <typename T> struct XCOFFAuxiliaryHeader {
   }
 
   uint16_t getVersion() const { return static_cast<const T *>(this)->Version; }
+  uint64_t getEntryPointAddr() const {
+    return static_cast<const T *>(this)->EntryPointAddr;
+  }
 };
 
 struct XCOFFAuxiliaryHeader32 : XCOFFAuxiliaryHeader<XCOFFAuxiliaryHeader32> {
diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp
index d09e7b0698ca0..25a60f379fc22 100644
--- a/llvm/lib/Object/XCOFFObjectFile.cpp
+++ b/llvm/lib/Object/XCOFFObjectFile.cpp
@@ -737,9 +737,11 @@ bool XCOFFObjectFile::isRelocatableObject() const {
 }
 
 Expected<uint64_t> XCOFFObjectFile::getStartAddress() const {
-  // TODO FIXME Should get from auxiliary_header->o_entry when support for the
-  // auxiliary_header is added.
-  return 0;
+  if (AuxiliaryHeader == nullptr)
+    return 0;
+
+  return is64Bit() ? auxiliaryHeader64()->getEntryPointAddr()
+                   : auxiliaryHeader32()->getEntryPointAddr();
 }
 
 StringRef XCOFFObjectFile::mapDebugSectionName(StringRef Name) const {
diff --git a/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test b/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test
new file mode 100644
index 0000000000000..121f550d11b55
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test
@@ -0,0 +1,56 @@
+# Test the `--file-headers` option of llvm-objdump for XCOFF object files.  
+# RUN: yaml2obj %s -o %t1
+# RUN: llvm-objdump --file-headers %t1 | FileCheck %s --check-prefix=CHECK32
+# RUN: yaml2obj %s -DMAGIC=0x1F7 -DFLAG64=0x2 -o %t2
+# RUN: llvm-objdump --file-headers  %t2 | FileCheck %s --check-prefix=CHECK64
+
+# CHECK32:      {{.*}}file format aixcoff-rs6000 
+# CHECK32-NEXT: architecture: powerpc
+# CHECK32-NEXT: start address: 0x00001111
+
+# CHECK64:      {{.*}}file format aix5coff64-rs6000
+# CHECK64-NEXT: architecture: powerpc64
+# CHECK64-NEXT: start address: 0x0000000000001111
+
+--- !XCOFF
+FileHeader:
+  MagicNumber: [[MAGIC=0x1DF]]
+AuxiliaryHeader:
+  Magic:                 0x10B
+  Version:               0x1
+  TextSectionSize:       0x8
+  DataSectionSize:       0x9
+  BssSectionSize:        0x10
+  EntryPointAddr:        0x1111
+  TextStartAddr:         0x2222
+  DataStartAddr:         0x3333
+  TOCAnchorAddr:         0x4444
+  SecNumOfEntryPoint:    1
+  SecNumOfText:          2
+  SecNumOfData:          3
+  SecNumOfTOC:           4
+  SecNumOfLoader:        5
+  SecNumOfBSS:           6
+  MaxAlignOfText:        0x7
+  MaxAlignOfData:        0x3
+  ModuleType:            0x1
+  TextPageSize:          0x1
+  DataPageSize:          0x1
+  StackPageSize:         0x1
+  SecNumOfTData:         7
+  SecNumOfTBSS:          8
+  FlagAndTDataAlignment: 0x1
+  Flag:                  [[FLAG64=<none>]]
+Sections:
+  - Flags:       [ STYP_TEXT ]
+    SectionData: "1232"
+  - Flags:       [ STYP_DATA ]
+    SectionData: "5678"
+  - Flags:       [ STYP_BSS ]
+    SectionData: "9101"
+  - Flags:       [ STYP_TDATA ]
+    SectionData: "1112"
+  - Flags:       [ STYP_TBSS ]
+    SectionData: "1314"
+  - Flags:       [ STYP_LOADER ]
+    SectionData: "1516"
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 8265ab9d7fe6b..6249be4f332b7 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3151,7 +3151,7 @@ void Dumper::printPrivateHeaders() {
 }
 
 static void printFileHeaders(const ObjectFile *O) {
-  if (!O->isELF() && !O->isCOFF())
+  if (!O->isELF() && !O->isCOFF() && !O->isXCOFF())
     reportError(O->getFileName(), "Invalid/Unsupported object file format");
 
   Triple::ArchType AT = O->getArch();

>From 83f72ba5b8143db237c87d7ec07cb4743683f1a1 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Wed, 19 Jun 2024 15:32:01 -0400
Subject: [PATCH 2/2] simply the test case

---
 .../llvm-objdump/XCOFF/file-headers.test      | 35 -------------------
 1 file changed, 35 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test b/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test
index 121f550d11b55..84b3fcbb02cbb 100644
--- a/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test
+++ b/llvm/test/tools/llvm-objdump/XCOFF/file-headers.test
@@ -16,41 +16,6 @@
 FileHeader:
   MagicNumber: [[MAGIC=0x1DF]]
 AuxiliaryHeader:
-  Magic:                 0x10B
-  Version:               0x1
-  TextSectionSize:       0x8
-  DataSectionSize:       0x9
-  BssSectionSize:        0x10
   EntryPointAddr:        0x1111
-  TextStartAddr:         0x2222
-  DataStartAddr:         0x3333
-  TOCAnchorAddr:         0x4444
-  SecNumOfEntryPoint:    1
-  SecNumOfText:          2
-  SecNumOfData:          3
-  SecNumOfTOC:           4
-  SecNumOfLoader:        5
-  SecNumOfBSS:           6
-  MaxAlignOfText:        0x7
-  MaxAlignOfData:        0x3
-  ModuleType:            0x1
-  TextPageSize:          0x1
-  DataPageSize:          0x1
-  StackPageSize:         0x1
-  SecNumOfTData:         7
-  SecNumOfTBSS:          8
   FlagAndTDataAlignment: 0x1
   Flag:                  [[FLAG64=<none>]]
-Sections:
-  - Flags:       [ STYP_TEXT ]
-    SectionData: "1232"
-  - Flags:       [ STYP_DATA ]
-    SectionData: "5678"
-  - Flags:       [ STYP_BSS ]
-    SectionData: "9101"
-  - Flags:       [ STYP_TDATA ]
-    SectionData: "1112"
-  - Flags:       [ STYP_TBSS ]
-    SectionData: "1314"
-  - Flags:       [ STYP_LOADER ]
-    SectionData: "1516"



More information about the llvm-commits mailing list