https://github.com/DhruvSrivastavaX updated 
https://github.com/llvm/llvm-project/pull/141577

>From a62cd7b510f3cf74ee356a95a26e0f9922f4b39c Mon Sep 17 00:00:00 2001
From: DhruvSrivastavaX <dhruv.srivast...@ibm.com>
Date: Tue, 27 May 2025 05:44:55 -0500
Subject: [PATCH 1/4] Added XCOFF ParseSymtab handling

---
 .../ObjectFile/XCOFF/ObjectFileXCOFF.cpp      | 66 ++++++++++++++++++-
 1 file changed, 65 insertions(+), 1 deletion(-)

diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp 
b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
index e629355cd40b9..7dfe6c362add4 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -188,7 +188,71 @@ AddressClass ObjectFileXCOFF::GetAddressClass(addr_t 
file_addr) {
   return AddressClass::eUnknown;
 }
 
-void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {}
+lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
+  if (sym_type == llvm::object::SymbolRef::ST_Function)
+    return lldb::eSymbolTypeCode;
+  else if (sym_type == llvm::object::SymbolRef::ST_Data)
+    return lldb::eSymbolTypeData;
+  else if (sym_type == llvm::object::SymbolRef::ST_File)
+    return lldb::eSymbolTypeSourceFile;
+  return lldb::eSymbolTypeInvalid;
+}
+
+void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
+  SectionList *sectionList = GetSectionList();
+
+  for (const auto &symbol_ref : m_binary->symbols()) {
+    llvm::object::XCOFFSymbolRef xcoff_sym_ref(symbol_ref);
+    llvm::Expected<llvm::StringRef> name_or_err = xcoff_sym_ref.getName();
+    if (!name_or_err) {
+      consumeError(name_or_err.takeError());
+      continue;
+    }
+    llvm::StringRef symbolName = name_or_err.get();
+    // Remove the dot prefix for demangle
+    llvm::StringRef symbol_name =
+        symbolName.starts_with(".") ? symbolName.drop_front() : symbolName;
+    auto storageClass = xcoff_sym_ref.getStorageClass();
+    if (storageClass == XCOFF::C_HIDEXT && symbolName != "TOC") {
+      if (xcoff_sym_ref.getNumberOfAuxEntries() != 1)
+        continue;
+      auto aux_csect_or_err = xcoff_sym_ref.getXCOFFCsectAuxRef();
+      if (!aux_csect_or_err) {
+        consumeError(aux_csect_or_err.takeError());
+        continue;
+      }
+      const llvm::object::XCOFFCsectAuxRef csect_aux = aux_csect_or_err.get();
+      if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR ||
+          (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT)
+                               : false))
+        continue;
+    }
+
+    Symbol symbol;
+    symbol.GetMangled().SetValue(ConstString(symbol_name));
+
+    int16_t sectionNumber = xcoff_sym_ref.getSectionNumber();
+    size_t sectionIndex = static_cast<size_t>(sectionNumber - 1);
+    if (sectionNumber > 0 && sectionIndex < sectionList->GetSize()) {
+      lldb::SectionSP section_sp =
+          sectionList->GetSectionAtIndex(sectionNumber - 1);
+      if (!section_sp || section_sp->GetFileAddress() == LLDB_INVALID_ADDRESS)
+        continue;
+      lldb::addr_t file_addr = section_sp->GetFileAddress();
+      lldb::addr_t symbolValue = xcoff_sym_ref.getValue();
+      if (symbolValue < file_addr)
+        continue;
+      symbol.GetAddressRef() = Address(section_sp, symbolValue - file_addr);
+    }
+
+    Expected<llvm::object::SymbolRef::Type> sym_type_or_err =
+        symbol_ref.getType();
+    symbol.SetType(MapSymbolType(sym_type_or_err.get()));
+    printf("%s %d\n", symbol.GetName(), *sym_type_or_err);
+
+    lldb_symtab.AddSymbol(symbol);
+  }
+}
 
 bool ObjectFileXCOFF::IsStripped() { return false; }
 

>From 21f5a39976457589e2ab9666820c08331aaf4542 Mon Sep 17 00:00:00 2001
From: Dhruv Srivastava <dhruv.srivast...@ibm.com>
Date: Tue, 27 May 2025 16:33:08 +0530
Subject: [PATCH 2/4] cleanup

---
 lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp 
b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
index 7dfe6c362add4..1e84b86cd6f0a 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -247,8 +247,11 @@ void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
 
     Expected<llvm::object::SymbolRef::Type> sym_type_or_err =
         symbol_ref.getType();
+    if (!sym_type_or_err) {
+      consumeError(sym_type_or_err.takeError());
+      continue;
+    }
     symbol.SetType(MapSymbolType(sym_type_or_err.get()));
-    printf("%s %d\n", symbol.GetName(), *sym_type_or_err);
 
     lldb_symtab.AddSymbol(symbol);
   }

>From 4d631899cd3ab96ea3819e1ece3ce2851d1f9f6c Mon Sep 17 00:00:00 2001
From: DhruvSrivastavaX <dhruv.srivast...@ibm.com>
Date: Thu, 29 May 2025 07:37:23 -0500
Subject: [PATCH 3/4] Addressed comments

---
 .../ObjectFile/XCOFF/ObjectFileXCOFF.cpp      | 27 ++++++++++++-------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp 
b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
index 1e84b86cd6f0a..953d72293c81d 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -205,31 +205,39 @@ void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
     llvm::object::XCOFFSymbolRef xcoff_sym_ref(symbol_ref);
     llvm::Expected<llvm::StringRef> name_or_err = xcoff_sym_ref.getName();
     if (!name_or_err) {
-      consumeError(name_or_err.takeError());
+      LLDB_LOG_ERROR(log, name_or_err.takeError(),
+                     "Unable to extract name from the xcoff symbol ref 
object");
       continue;
     }
     llvm::StringRef symbolName = name_or_err.get();
-    // Remove the dot prefix for demangle
-    llvm::StringRef symbol_name =
+    // Remove the dot prefix from symbol names.
+    llvm::StringRef name_no_dot =
         symbolName.starts_with(".") ? symbolName.drop_front() : symbolName;
     auto storageClass = xcoff_sym_ref.getStorageClass();
+    // If its the hidden ext TOC symbol, add it directly,
+    // for all other C_HIDEXT symbols, proceed to other checks.
     if (storageClass == XCOFF::C_HIDEXT && symbolName != "TOC") {
+      // We do not need to add entries with 0 or >1 auxiliary data
       if (xcoff_sym_ref.getNumberOfAuxEntries() != 1)
         continue;
       auto aux_csect_or_err = xcoff_sym_ref.getXCOFFCsectAuxRef();
       if (!aux_csect_or_err) {
-        consumeError(aux_csect_or_err.takeError());
+        LLDB_LOG_ERROR(log, aux_csect_or_err.takeError(),
+                       "Unable to access xcoff csect aux ref object");
         continue;
       }
       const llvm::object::XCOFFCsectAuxRef csect_aux = aux_csect_or_err.get();
-      if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR ||
-          (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT)
-                               : false))
+      // Only add hidden ext entries which come under Program Code, skip others
+      if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR)
+        continue;
+      // This does not apply to 32-bit,
+      // Only add csect symbols identified by the aux entry, skip others
+      if (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT))
         continue;
     }
 
     Symbol symbol;
-    symbol.GetMangled().SetValue(ConstString(symbol_name));
+    symbol.GetMangled().SetValue(ConstString(name_no_dot));
 
     int16_t sectionNumber = xcoff_sym_ref.getSectionNumber();
     size_t sectionIndex = static_cast<size_t>(sectionNumber - 1);
@@ -248,7 +256,8 @@ void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
     Expected<llvm::object::SymbolRef::Type> sym_type_or_err =
         symbol_ref.getType();
     if (!sym_type_or_err) {
-      consumeError(sym_type_or_err.takeError());
+      LLDB_LOG_ERROR(log, aux_csect_or_err.takeError(),
+                     "Unable to access xcoff symbol type");
       continue;
     }
     symbol.SetType(MapSymbolType(sym_type_or_err.get()));

>From 7a4b7827ef942ae2993385098a679fa9c61a1022 Mon Sep 17 00:00:00 2001
From: DhruvSrivastavaX <dhruv.srivast...@ibm.com>
Date: Mon, 9 Jun 2025 07:50:29 -0500
Subject: [PATCH 4/4] Addressed Comments

---
 .../ObjectFile/XCOFF/ObjectFileXCOFF.cpp      | 58 +++++++++++++------
 1 file changed, 39 insertions(+), 19 deletions(-)

diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp 
b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
index 953d72293c81d..56999376d96c2 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -188,78 +188,98 @@ AddressClass ObjectFileXCOFF::GetAddressClass(addr_t 
file_addr) {
   return AddressClass::eUnknown;
 }
 
-lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
-  if (sym_type == llvm::object::SymbolRef::ST_Function)
+static lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
+  switch (sym_type) {
+  case llvm::object::SymbolRef::ST_Function:
     return lldb::eSymbolTypeCode;
-  else if (sym_type == llvm::object::SymbolRef::ST_Data)
+  case llvm::object::SymbolRef::ST_Data:
     return lldb::eSymbolTypeData;
-  else if (sym_type == llvm::object::SymbolRef::ST_File)
+  case llvm::object::SymbolRef::ST_File:
     return lldb::eSymbolTypeSourceFile;
-  return lldb::eSymbolTypeInvalid;
+  default:
+    return lldb::eSymbolTypeInvalid;
+  }
 }
 
 void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
+  Log *log = GetLog(LLDBLog::Object);
   SectionList *sectionList = GetSectionList();
 
   for (const auto &symbol_ref : m_binary->symbols()) {
     llvm::object::XCOFFSymbolRef xcoff_sym_ref(symbol_ref);
+
     llvm::Expected<llvm::StringRef> name_or_err = xcoff_sym_ref.getName();
     if (!name_or_err) {
       LLDB_LOG_ERROR(log, name_or_err.takeError(),
                      "Unable to extract name from the xcoff symbol ref 
object");
       continue;
     }
+
     llvm::StringRef symbolName = name_or_err.get();
-    // Remove the dot prefix from symbol names.
+    // Remove the dot prefix from symbol names before adding to symtab. '.text'
+    // -> 'text'
     llvm::StringRef name_no_dot =
         symbolName.starts_with(".") ? symbolName.drop_front() : symbolName;
     auto storageClass = xcoff_sym_ref.getStorageClass();
     // If its the hidden ext TOC symbol, add it directly,
     // for all other C_HIDEXT symbols, proceed to other checks.
     if (storageClass == XCOFF::C_HIDEXT && symbolName != "TOC") {
+
       // We do not need to add entries with 0 or >1 auxiliary data
       if (xcoff_sym_ref.getNumberOfAuxEntries() != 1)
         continue;
+
       auto aux_csect_or_err = xcoff_sym_ref.getXCOFFCsectAuxRef();
       if (!aux_csect_or_err) {
         LLDB_LOG_ERROR(log, aux_csect_or_err.takeError(),
                        "Unable to access xcoff csect aux ref object");
         continue;
       }
+
       const llvm::object::XCOFFCsectAuxRef csect_aux = aux_csect_or_err.get();
+
       // Only add hidden ext entries which come under Program Code, skip others
       if (csect_aux.getStorageMappingClass() != XCOFF::XMC_PR)
         continue;
+
       // This does not apply to 32-bit,
       // Only add csect symbols identified by the aux entry, skip others
-      if (m_binary->is64Bit() ? (csect_aux.getAuxType64() != XCOFF::AUX_CSECT))
-        continue;
+      if (m_binary->is64Bit())
+        if (csect_aux.getAuxType64() != XCOFF::AUX_CSECT)
+          continue;
     }
 
     Symbol symbol;
     symbol.GetMangled().SetValue(ConstString(name_no_dot));
 
     int16_t sectionNumber = xcoff_sym_ref.getSectionNumber();
+    // Note that XCOFF section headers are numbered from 1 and not 0.
     size_t sectionIndex = static_cast<size_t>(sectionNumber - 1);
-    if (sectionNumber > 0 && sectionIndex < sectionList->GetSize()) {
-      lldb::SectionSP section_sp =
-          sectionList->GetSectionAtIndex(sectionNumber - 1);
-      if (!section_sp || section_sp->GetFileAddress() == LLDB_INVALID_ADDRESS)
-        continue;
-      lldb::addr_t file_addr = section_sp->GetFileAddress();
-      lldb::addr_t symbolValue = xcoff_sym_ref.getValue();
-      if (symbolValue < file_addr)
-        continue;
-      symbol.GetAddressRef() = Address(section_sp, symbolValue - file_addr);
+    if (sectionNumber > 0) {
+      if (sectionIndex < sectionList->GetSize()) {
+
+        lldb::SectionSP section_sp =
+            sectionList->GetSectionAtIndex(sectionIndex);
+        if (!section_sp || section_sp->GetFileAddress() == 
LLDB_INVALID_ADDRESS)
+          continue;
+
+        lldb::addr_t file_addr = section_sp->GetFileAddress();
+        lldb::addr_t symbolValue = xcoff_sym_ref.getValue();
+        if (symbolValue < file_addr)
+          continue;
+
+        symbol.GetAddressRef() = Address(section_sp, symbolValue - file_addr);
+      }
     }
 
     Expected<llvm::object::SymbolRef::Type> sym_type_or_err =
         symbol_ref.getType();
     if (!sym_type_or_err) {
-      LLDB_LOG_ERROR(log, aux_csect_or_err.takeError(),
+      LLDB_LOG_ERROR(log, sym_type_or_err.takeError(),
                      "Unable to access xcoff symbol type");
       continue;
     }
+
     symbol.SetType(MapSymbolType(sym_type_or_err.get()));
 
     lldb_symtab.AddSymbol(symbol);

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to