[Lldb-commits] [lldb] [lldb][AIX] Added XCOFF Object File Header for AIX (PR #111814)
Dhruv Srivastava via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 17 09:09:29 PDT 2024
https://github.com/DhruvSrivastavaX updated https://github.com/llvm/llvm-project/pull/111814
>From 08c9d5ae66ca857d165dc878ebd1b2e0de364a24 Mon Sep 17 00:00:00 2001
From: Dhruv-Srivastava <dhruv.srivastava at ibm.com>
Date: Thu, 10 Oct 2024 02:24:42 -0500
Subject: [PATCH 1/6] Taking base file structure from ELF as reference
---
.../ObjectFile/XCOFF/ObjectFileXCOFF.h | 440 ++++++++++++++++++
1 file changed, 440 insertions(+)
create mode 100644 lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
new file mode 100644
index 00000000000000..aba3a5bfcbf5b6
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -0,0 +1,440 @@
+//===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
+#define LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
+
+#include <cstdint>
+
+#include <optional>
+#include <vector>
+
+#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Utility/ArchSpec.h"
+#include "lldb/Utility/FileSpec.h"
+#include "lldb/Utility/UUID.h"
+#include "lldb/lldb-private.h"
+
+#include "ELFHeader.h"
+
+struct ELFNote {
+ elf::elf_word n_namesz = 0;
+ elf::elf_word n_descsz = 0;
+ elf::elf_word n_type = 0;
+
+ std::string n_name;
+
+ ELFNote() = default;
+
+ /// Parse an ELFNote entry from the given DataExtractor starting at position
+ /// \p offset.
+ ///
+ /// \param[in] data
+ /// The DataExtractor to read from.
+ ///
+ /// \param[in,out] offset
+ /// Pointer to an offset in the data. On return the offset will be
+ /// advanced by the number of bytes read.
+ ///
+ /// \return
+ /// True if the ELFRel entry was successfully read and false otherwise.
+ bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
+
+ size_t GetByteSize() const {
+ return 12 + llvm::alignTo(n_namesz, 4) + llvm::alignTo(n_descsz, 4);
+ }
+};
+
+/// \class ObjectFileELF
+/// Generic ELF object file reader.
+///
+/// This class provides a generic ELF (32/64 bit) reader plugin implementing
+/// the ObjectFile protocol.
+class ObjectFileELF : public lldb_private::ObjectFile {
+public:
+ // Static Functions
+ static void Initialize();
+
+ static void Terminate();
+
+ static llvm::StringRef GetPluginNameStatic() { return "elf"; }
+
+ static llvm::StringRef GetPluginDescriptionStatic() {
+ return "ELF object file reader.";
+ }
+
+ static lldb_private::ObjectFile *
+ CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
+ lldb::offset_t data_offset, const lldb_private::FileSpec *file,
+ lldb::offset_t file_offset, lldb::offset_t length);
+
+ static lldb_private::ObjectFile *CreateMemoryInstance(
+ const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
+ const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+
+ static size_t GetModuleSpecifications(const lldb_private::FileSpec &file,
+ lldb::DataBufferSP &data_sp,
+ lldb::offset_t data_offset,
+ lldb::offset_t file_offset,
+ lldb::offset_t length,
+ lldb_private::ModuleSpecList &specs);
+
+ static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
+ lldb::addr_t length);
+
+ // PluginInterface protocol
+ llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
+
+ // LLVM RTTI support
+ static char ID;
+ bool isA(const void *ClassID) const override {
+ return ClassID == &ID || ObjectFile::isA(ClassID);
+ }
+ static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
+
+ // ObjectFile Protocol.
+ bool ParseHeader() override;
+
+ bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
+ bool value_is_offset) override;
+
+ lldb::ByteOrder GetByteOrder() const override;
+
+ bool IsExecutable() const override;
+
+ uint32_t GetAddressByteSize() const override;
+
+ lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override;
+
+ void ParseSymtab(lldb_private::Symtab &symtab) override;
+
+ bool IsStripped() override;
+
+ void CreateSections(lldb_private::SectionList &unified_section_list) override;
+
+ void Dump(lldb_private::Stream *s) override;
+
+ lldb_private::ArchSpec GetArchitecture() override;
+
+ lldb_private::UUID GetUUID() override;
+
+ /// Return the contents of the .gnu_debuglink section, if the object file
+ /// contains it.
+ std::optional<lldb_private::FileSpec> GetDebugLink();
+
+ uint32_t GetDependentModules(lldb_private::FileSpecList &files) override;
+
+ lldb_private::Address
+ GetImageInfoAddress(lldb_private::Target *target) override;
+
+ lldb_private::Address GetEntryPointAddress() override;
+
+ lldb_private::Address GetBaseAddress() override;
+
+ ObjectFile::Type CalculateType() override;
+
+ ObjectFile::Strata CalculateStrata() override;
+
+ size_t ReadSectionData(lldb_private::Section *section,
+ lldb::offset_t section_offset, void *dst,
+ size_t dst_len) override;
+
+ size_t ReadSectionData(lldb_private::Section *section,
+ lldb_private::DataExtractor §ion_data) override;
+
+ llvm::ArrayRef<elf::ELFProgramHeader> ProgramHeaders();
+ lldb_private::DataExtractor GetSegmentData(const elf::ELFProgramHeader &H);
+
+ llvm::StringRef
+ StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const override;
+
+ void RelocateSection(lldb_private::Section *section) override;
+
+protected:
+
+ std::vector<LoadableData>
+ GetLoadableData(lldb_private::Target &target) override;
+
+ static lldb::WritableDataBufferSP
+ MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
+ uint64_t Offset);
+
+private:
+ ObjectFileELF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
+ lldb::offset_t data_offset, const lldb_private::FileSpec *file,
+ lldb::offset_t offset, lldb::offset_t length);
+
+ ObjectFileELF(const lldb::ModuleSP &module_sp,
+ lldb::DataBufferSP header_data_sp,
+ const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+
+ typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl;
+
+ struct ELFSectionHeaderInfo : public elf::ELFSectionHeader {
+ lldb_private::ConstString section_name;
+ };
+
+ typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl;
+ typedef SectionHeaderColl::iterator SectionHeaderCollIter;
+ typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter;
+
+ struct ELFDynamicWithName {
+ elf::ELFDynamic symbol;
+ std::string name;
+ };
+ typedef std::vector<ELFDynamicWithName> DynamicSymbolColl;
+ typedef DynamicSymbolColl::iterator DynamicSymbolCollIter;
+ typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter;
+
+ /// An ordered map of file address to address class. Used on architectures
+ /// like Arm where there is an alternative ISA mode like Thumb. The container
+ /// is ordered so that it can be binary searched.
+ typedef std::map<lldb::addr_t, lldb_private::AddressClass>
+ FileAddressToAddressClassMap;
+
+ /// Version of this reader common to all plugins based on this class.
+ static const uint32_t m_plugin_version = 1;
+ static const uint32_t g_core_uuid_magic;
+
+ /// ELF file header.
+ elf::ELFHeader m_header;
+
+ /// ELF build ID.
+ lldb_private::UUID m_uuid;
+
+ /// ELF .gnu_debuglink file and crc data if available.
+ std::string m_gnu_debuglink_file;
+ uint32_t m_gnu_debuglink_crc = 0;
+
+ /// Collection of program headers.
+ ProgramHeaderColl m_program_headers;
+
+ /// Collection of section headers.
+ SectionHeaderColl m_section_headers;
+
+ /// The file address of the .dynamic section. This can be found in the p_vaddr
+ /// of the PT_DYNAMIC program header.
+ lldb::addr_t m_dynamic_base_addr = LLDB_INVALID_ADDRESS;
+
+ /// Collection of symbols from the dynamic table.
+ DynamicSymbolColl m_dynamic_symbols;
+
+ /// Object file parsed from .gnu_debugdata section (\sa
+ /// GetGnuDebugDataObjectFile())
+ std::shared_ptr<ObjectFileELF> m_gnu_debug_data_object_file;
+
+ /// List of file specifications corresponding to the modules (shared
+ /// libraries) on which this object file depends.
+ mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_up;
+
+ /// Cached value of the entry point for this module.
+ lldb_private::Address m_entry_point_address;
+
+ /// The architecture detected from parsing elf file contents.
+ lldb_private::ArchSpec m_arch_spec;
+
+ /// The address class for each symbol in the elf file
+ FileAddressToAddressClassMap m_address_class_map;
+
+ /// Returns the index of the given section header.
+ size_t SectionIndex(const SectionHeaderCollIter &I);
+
+ /// Returns the index of the given section header.
+ size_t SectionIndex(const SectionHeaderCollConstIter &I) const;
+
+ // Parses the ELF program headers.
+ static size_t GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
+ lldb_private::DataExtractor &object_data,
+ const elf::ELFHeader &header);
+
+ // Finds PT_NOTE segments and calculates their crc sum.
+ static uint32_t
+ CalculateELFNotesSegmentsCRC32(const ProgramHeaderColl &program_headers,
+ lldb_private::DataExtractor &data);
+
+ /// Parses all section headers present in this object file and populates
+ /// m_program_headers. This method will compute the header list only once.
+ /// Returns true iff the headers have been successfully parsed.
+ bool ParseProgramHeaders();
+
+ /// Parses all section headers present in this object file and populates
+ /// m_section_headers. This method will compute the header list only once.
+ /// Returns the number of headers parsed.
+ size_t ParseSectionHeaders();
+
+ lldb::SectionType GetSectionType(const ELFSectionHeaderInfo &H) const;
+
+ static void ParseARMAttributes(lldb_private::DataExtractor &data,
+ uint64_t length,
+ lldb_private::ArchSpec &arch_spec);
+
+ /// Parses the elf section headers and returns the uuid, debug link name,
+ /// crc, archspec.
+ static size_t GetSectionHeaderInfo(SectionHeaderColl §ion_headers,
+ lldb_private::DataExtractor &object_data,
+ const elf::ELFHeader &header,
+ lldb_private::UUID &uuid,
+ std::string &gnu_debuglink_file,
+ uint32_t &gnu_debuglink_crc,
+ lldb_private::ArchSpec &arch_spec);
+
+ /// Scans the dynamic section and locates all dependent modules (shared
+ /// libraries) populating m_filespec_up. This method will compute the
+ /// dependent module list only once. Returns the number of dependent
+ /// modules parsed.
+ size_t ParseDependentModules();
+
+ /// Parses the dynamic symbol table and populates m_dynamic_symbols. The
+ /// vector retains the order as found in the object file. Returns the
+ /// number of dynamic symbols parsed.
+ size_t ParseDynamicSymbols();
+
+ /// Populates the symbol table with all non-dynamic linker symbols. This
+ /// method will parse the symbols only once. Returns the number of symbols
+ /// parsed and a map of address types (used by targets like Arm that have
+ /// an alternative ISA mode like Thumb).
+ std::pair<unsigned, FileAddressToAddressClassMap>
+ ParseSymbolTable(lldb_private::Symtab *symbol_table, lldb::user_id_t start_id,
+ lldb_private::Section *symtab);
+
+ /// Helper routine for ParseSymbolTable().
+ std::pair<unsigned, FileAddressToAddressClassMap>
+ ParseSymbols(lldb_private::Symtab *symbol_table, lldb::user_id_t start_id,
+ lldb_private::SectionList *section_list,
+ const size_t num_symbols,
+ const lldb_private::DataExtractor &symtab_data,
+ const lldb_private::DataExtractor &strtab_data);
+
+ /// Scans the relocation entries and adds a set of artificial symbols to the
+ /// given symbol table for each PLT slot. Returns the number of symbols
+ /// added.
+ unsigned ParseTrampolineSymbols(lldb_private::Symtab *symbol_table,
+ lldb::user_id_t start_id,
+ const ELFSectionHeaderInfo *rela_hdr,
+ lldb::user_id_t section_id);
+
+ void ParseUnwindSymbols(lldb_private::Symtab *symbol_table,
+ lldb_private::DWARFCallFrameInfo *eh_frame);
+
+ /// Relocates debug sections
+ unsigned RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr,
+ lldb::user_id_t rel_id,
+ lldb_private::Symtab *thetab);
+
+ unsigned ApplyRelocations(lldb_private::Symtab *symtab,
+ const elf::ELFHeader *hdr,
+ const elf::ELFSectionHeader *rel_hdr,
+ const elf::ELFSectionHeader *symtab_hdr,
+ const elf::ELFSectionHeader *debug_hdr,
+ lldb_private::DataExtractor &rel_data,
+ lldb_private::DataExtractor &symtab_data,
+ lldb_private::DataExtractor &debug_data,
+ lldb_private::Section *rel_section);
+
+ /// Loads the section name string table into m_shstr_data. Returns the
+ /// number of bytes constituting the table.
+ size_t GetSectionHeaderStringTable();
+
+ /// Utility method for looking up a section given its name. Returns the
+ /// index of the corresponding section or zero if no section with the given
+ /// name can be found (note that section indices are always 1 based, and so
+ /// section index 0 is never valid).
+ lldb::user_id_t GetSectionIndexByName(const char *name);
+
+ /// Returns the section header with the given id or NULL.
+ const ELFSectionHeaderInfo *GetSectionHeaderByIndex(lldb::user_id_t id);
+
+ /// \name ELF header dump routines
+ //@{
+ static void DumpELFHeader(lldb_private::Stream *s,
+ const elf::ELFHeader &header);
+
+ static void DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
+ unsigned char ei_data);
+
+ static void DumpELFHeader_e_type(lldb_private::Stream *s,
+ elf::elf_half e_type);
+ //@}
+
+ /// \name ELF program header dump routines
+ //@{
+ void DumpELFProgramHeaders(lldb_private::Stream *s);
+
+ static void DumpELFProgramHeader(lldb_private::Stream *s,
+ const elf::ELFProgramHeader &ph);
+
+ static void DumpELFProgramHeader_p_type(lldb_private::Stream *s,
+ elf::elf_word p_type);
+
+ static void DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
+ elf::elf_word p_flags);
+ //@}
+
+ /// \name ELF section header dump routines
+ //@{
+ void DumpELFSectionHeaders(lldb_private::Stream *s);
+
+ static void DumpELFSectionHeader(lldb_private::Stream *s,
+ const ELFSectionHeaderInfo &sh);
+
+ static void DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
+ elf::elf_word sh_type);
+
+ static void DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
+ elf::elf_xword sh_flags);
+ //@}
+
+ /// ELF dependent module dump routine.
+ void DumpDependentModules(lldb_private::Stream *s);
+
+ /// ELF dump the .dynamic section
+ void DumpELFDynamic(lldb_private::Stream *s);
+
+ const elf::ELFDynamic *FindDynamicSymbol(unsigned tag);
+
+ unsigned PLTRelocationType();
+
+ static lldb_private::Status
+ RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
+ lldb_private::ArchSpec &arch_spec,
+ lldb_private::UUID &uuid);
+
+ bool AnySegmentHasPhysicalAddress();
+
+ /// Takes the .gnu_debugdata and returns the decompressed object file that is
+ /// stored within that section.
+ ///
+ /// \returns either the decompressed object file stored within the
+ /// .gnu_debugdata section or \c nullptr if an error occured or if there's no
+ /// section with that name.
+ std::shared_ptr<ObjectFileELF> GetGnuDebugDataObjectFile();
+
+ /// Get the bytes that represent the .dynamic section.
+ ///
+ /// This function will fetch the data for the .dynamic section in an ELF file.
+ /// The PT_DYNAMIC program header will be used to extract the data and this
+ /// function will fall back to using the section headers if PT_DYNAMIC isn't
+ /// found.
+ ///
+ /// \return The bytes that represent the string table data or \c std::nullopt
+ /// if an error occured.
+ std::optional<lldb_private::DataExtractor> GetDynamicData();
+
+ /// Get the bytes that represent the dynamic string table data.
+ ///
+ /// This function will fetch the data for the string table in an ELF file. If
+ /// the ELF file is loaded from a file on disk, it will use the section
+ /// headers to extract the data and fall back to using the DT_STRTAB and
+ /// DT_STRSZ .dynamic entries.
+ ///
+ /// \return The bytes that represent the string table data or \c std::nullopt
+ /// if an error occured.
+ std::optional<lldb_private::DataExtractor> GetDynstrData();
+};
+
+#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
>From d05a2c386e33a343fd7103b6803eed8437eed1af Mon Sep 17 00:00:00 2001
From: Dhruv-Srivastava <dhruv.srivastava at ibm.com>
Date: Thu, 10 Oct 2024 03:08:23 -0500
Subject: [PATCH 2/6] Modified code for XOCFF
---
.../ObjectFile/XCOFF/ObjectFileXCOFF.h | 435 +++++-------------
1 file changed, 119 insertions(+), 316 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
index aba3a5bfcbf5b6..5a12d16886489d 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -1,4 +1,4 @@
-//===-- ObjectFileELF.h --------------------------------------- -*- C++ -*-===//
+//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,12 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
-#define LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
+#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H
+#define LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H
#include <cstdint>
-#include <optional>
#include <vector>
#include "lldb/Symbol/ObjectFile.h"
@@ -19,53 +18,24 @@
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/UUID.h"
#include "lldb/lldb-private.h"
+#include "llvm/Object/XCOFFObjectFile.h"
-#include "ELFHeader.h"
-
-struct ELFNote {
- elf::elf_word n_namesz = 0;
- elf::elf_word n_descsz = 0;
- elf::elf_word n_type = 0;
-
- std::string n_name;
-
- ELFNote() = default;
-
- /// Parse an ELFNote entry from the given DataExtractor starting at position
- /// \p offset.
- ///
- /// \param[in] data
- /// The DataExtractor to read from.
- ///
- /// \param[in,out] offset
- /// Pointer to an offset in the data. On return the offset will be
- /// advanced by the number of bytes read.
- ///
- /// \return
- /// True if the ELFRel entry was successfully read and false otherwise.
- bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
-
- size_t GetByteSize() const {
- return 12 + llvm::alignTo(n_namesz, 4) + llvm::alignTo(n_descsz, 4);
- }
-};
-
-/// \class ObjectFileELF
-/// Generic ELF object file reader.
+/// \class ObjectFileXCOFF
+/// Generic XCOFF object file reader.
///
-/// This class provides a generic ELF (32/64 bit) reader plugin implementing
+/// This class provides a generic XCOFF (32/64 bit) reader plugin implementing
/// the ObjectFile protocol.
-class ObjectFileELF : public lldb_private::ObjectFile {
+class ObjectFileXCOFF : public lldb_private::ObjectFile {
public:
// Static Functions
static void Initialize();
static void Terminate();
- static llvm::StringRef GetPluginNameStatic() { return "elf"; }
+ static llvm::StringRef GetPluginNameStatic() { return "xcoff"; }
static llvm::StringRef GetPluginDescriptionStatic() {
- return "ELF object file reader.";
+ return "XCOFF object file reader.";
}
static lldb_private::ObjectFile *
@@ -87,6 +57,8 @@ class ObjectFileELF : public lldb_private::ObjectFile {
static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
lldb::addr_t length);
+ static lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type);
+
// PluginInterface protocol
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
@@ -103,6 +75,9 @@ class ObjectFileELF : public lldb_private::ObjectFile {
bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
bool value_is_offset) override;
+ bool SetLoadAddressByType(lldb_private::Target &target, lldb::addr_t value,
+ bool value_is_offset, int type_id) override;
+
lldb::ByteOrder GetByteOrder() const override;
bool IsExecutable() const override;
@@ -140,301 +115,129 @@ class ObjectFileELF : public lldb_private::ObjectFile {
ObjectFile::Strata CalculateStrata() override;
- size_t ReadSectionData(lldb_private::Section *section,
- lldb::offset_t section_offset, void *dst,
- size_t dst_len) override;
-
- size_t ReadSectionData(lldb_private::Section *section,
- lldb_private::DataExtractor §ion_data) override;
-
- llvm::ArrayRef<elf::ELFProgramHeader> ProgramHeaders();
- lldb_private::DataExtractor GetSegmentData(const elf::ELFProgramHeader &H);
-
llvm::StringRef
StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const override;
void RelocateSection(lldb_private::Section *section) override;
-protected:
+ lldb_private::DataExtractor ReadImageData(uint32_t offset, size_t size);
- std::vector<LoadableData>
- GetLoadableData(lldb_private::Target &target) override;
-
- static lldb::WritableDataBufferSP
- MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
- uint64_t Offset);
-
-private:
- ObjectFileELF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
+ ObjectFileXCOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
lldb::offset_t data_offset, const lldb_private::FileSpec *file,
lldb::offset_t offset, lldb::offset_t length);
- ObjectFileELF(const lldb::ModuleSP &module_sp,
+ ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
lldb::DataBufferSP header_data_sp,
const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
- typedef std::vector<elf::ELFProgramHeader> ProgramHeaderColl;
-
- struct ELFSectionHeaderInfo : public elf::ELFSectionHeader {
- lldb_private::ConstString section_name;
- };
-
- typedef std::vector<ELFSectionHeaderInfo> SectionHeaderColl;
- typedef SectionHeaderColl::iterator SectionHeaderCollIter;
- typedef SectionHeaderColl::const_iterator SectionHeaderCollConstIter;
-
- struct ELFDynamicWithName {
- elf::ELFDynamic symbol;
- std::string name;
- };
- typedef std::vector<ELFDynamicWithName> DynamicSymbolColl;
- typedef DynamicSymbolColl::iterator DynamicSymbolCollIter;
- typedef DynamicSymbolColl::const_iterator DynamicSymbolCollConstIter;
-
- /// An ordered map of file address to address class. Used on architectures
- /// like Arm where there is an alternative ISA mode like Thumb. The container
- /// is ordered so that it can be binary searched.
- typedef std::map<lldb::addr_t, lldb_private::AddressClass>
- FileAddressToAddressClassMap;
-
- /// Version of this reader common to all plugins based on this class.
- static const uint32_t m_plugin_version = 1;
- static const uint32_t g_core_uuid_magic;
-
- /// ELF file header.
- elf::ELFHeader m_header;
-
- /// ELF build ID.
- lldb_private::UUID m_uuid;
-
- /// ELF .gnu_debuglink file and crc data if available.
- std::string m_gnu_debuglink_file;
- uint32_t m_gnu_debuglink_crc = 0;
-
- /// Collection of program headers.
- ProgramHeaderColl m_program_headers;
+protected:
- /// Collection of section headers.
- SectionHeaderColl m_section_headers;
+ typedef struct xcoff_header {
+ uint16_t magic;
+ uint16_t nsects;
+ uint32_t modtime;
+ uint64_t symoff;
+ uint32_t nsyms;
+ uint16_t auxhdrsize;
+ uint16_t flags;
+ } xcoff_header_t;
+
+ typedef struct xcoff_aux_header {
+ uint16_t AuxMagic;
+ uint16_t Version;
+ uint32_t ReservedForDebugger;
+ uint64_t TextStartAddr;
+ uint64_t DataStartAddr;
+ uint64_t TOCAnchorAddr;
+ uint16_t SecNumOfEntryPoint;
+ uint16_t SecNumOfText;
+ uint16_t SecNumOfData;
+ uint16_t SecNumOfTOC;
+ uint16_t SecNumOfLoader;
+ uint16_t SecNumOfBSS;
+ uint16_t MaxAlignOfText;
+ uint16_t MaxAlignOfData;
+ uint16_t ModuleType;
+ uint8_t CpuFlag;
+ uint8_t CpuType;
+ uint8_t TextPageSize;
+ uint8_t DataPageSize;
+ uint8_t StackPageSize;
+ uint8_t FlagAndTDataAlignment;
+ uint64_t TextSize;
+ uint64_t InitDataSize;
+ uint64_t BssDataSize;
+ uint64_t EntryPointAddr;
+ uint64_t MaxStackSize;
+ uint64_t MaxDataSize;
+ uint16_t SecNumOfTData;
+ uint16_t SecNumOfTBSS;
+ uint16_t XCOFF64Flag;
+ } xcoff_aux_header_t;
+
+ typedef struct section_header {
+ char name[8];
+ uint64_t phyaddr; // Physical Addr
+ uint64_t vmaddr; // Virtual Addr
+ uint64_t size; // Section size
+ uint64_t offset; // File offset to raw data
+ uint64_t reloff; // Offset to relocations
+ uint64_t lineoff; // Offset to line table entries
+ uint32_t nreloc; // Number of relocation entries
+ uint32_t nline; // Number of line table entries
+ uint32_t flags;
+ } section_header_t;
+
+ typedef struct xcoff_symbol {
+ uint64_t value;
+ uint32_t offset;
+ uint16_t sect;
+ uint16_t type;
+ uint8_t storage;
+ uint8_t naux;
+ } xcoff_symbol_t;
+
+ typedef struct xcoff_sym_csect_aux_entry {
+ uint32_t section_or_len_low_byte;
+ uint32_t parameter_hash_index;
+ uint16_t type_check_sect_num;
+ uint8_t symbol_alignment_and_type;
+ uint8_t storage_mapping_class;
+ uint32_t section_or_len_high_byte;
+ uint8_t pad;
+ uint8_t aux_type;
+ } xcoff_sym_csect_aux_entry_t;
+
+ static bool ParseXCOFFHeader(lldb_private::DataExtractor &data,
+ lldb::offset_t *offset_ptr,
+ xcoff_header_t &xcoff_header);
+ bool ParseXCOFFOptionalHeader(lldb_private::DataExtractor &data,
+ lldb::offset_t *offset_ptr);
+ bool ParseSectionHeaders(uint32_t offset);
- /// The file address of the .dynamic section. This can be found in the p_vaddr
- /// of the PT_DYNAMIC program header.
- lldb::addr_t m_dynamic_base_addr = LLDB_INVALID_ADDRESS;
+ std::vector<LoadableData>
+ GetLoadableData(lldb_private::Target &target) override;
- /// Collection of symbols from the dynamic table.
- DynamicSymbolColl m_dynamic_symbols;
+ static lldb::WritableDataBufferSP
+ MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
+ uint64_t Offset);
+ llvm::StringRef GetSectionName(const section_header_t §);
+ static lldb::SectionType GetSectionType(llvm::StringRef sect_name,
+ const section_header_t §);
- /// Object file parsed from .gnu_debugdata section (\sa
- /// GetGnuDebugDataObjectFile())
- std::shared_ptr<ObjectFileELF> m_gnu_debug_data_object_file;
+ uint32_t ParseDependentModules();
+ typedef std::vector<section_header_t> SectionHeaderColl;
- /// List of file specifications corresponding to the modules (shared
- /// libraries) on which this object file depends.
- mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_up;
+private:
+ bool CreateBinary();
- /// Cached value of the entry point for this module.
+ xcoff_header_t m_xcoff_header;
+ xcoff_aux_header_t m_xcoff_aux_header;
+ SectionHeaderColl m_sect_headers;
+ std::unique_ptr<llvm::object::XCOFFObjectFile> m_binary;
lldb_private::Address m_entry_point_address;
-
- /// The architecture detected from parsing elf file contents.
- lldb_private::ArchSpec m_arch_spec;
-
- /// The address class for each symbol in the elf file
- FileAddressToAddressClassMap m_address_class_map;
-
- /// Returns the index of the given section header.
- size_t SectionIndex(const SectionHeaderCollIter &I);
-
- /// Returns the index of the given section header.
- size_t SectionIndex(const SectionHeaderCollConstIter &I) const;
-
- // Parses the ELF program headers.
- static size_t GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
- lldb_private::DataExtractor &object_data,
- const elf::ELFHeader &header);
-
- // Finds PT_NOTE segments and calculates their crc sum.
- static uint32_t
- CalculateELFNotesSegmentsCRC32(const ProgramHeaderColl &program_headers,
- lldb_private::DataExtractor &data);
-
- /// Parses all section headers present in this object file and populates
- /// m_program_headers. This method will compute the header list only once.
- /// Returns true iff the headers have been successfully parsed.
- bool ParseProgramHeaders();
-
- /// Parses all section headers present in this object file and populates
- /// m_section_headers. This method will compute the header list only once.
- /// Returns the number of headers parsed.
- size_t ParseSectionHeaders();
-
- lldb::SectionType GetSectionType(const ELFSectionHeaderInfo &H) const;
-
- static void ParseARMAttributes(lldb_private::DataExtractor &data,
- uint64_t length,
- lldb_private::ArchSpec &arch_spec);
-
- /// Parses the elf section headers and returns the uuid, debug link name,
- /// crc, archspec.
- static size_t GetSectionHeaderInfo(SectionHeaderColl §ion_headers,
- lldb_private::DataExtractor &object_data,
- const elf::ELFHeader &header,
- lldb_private::UUID &uuid,
- std::string &gnu_debuglink_file,
- uint32_t &gnu_debuglink_crc,
- lldb_private::ArchSpec &arch_spec);
-
- /// Scans the dynamic section and locates all dependent modules (shared
- /// libraries) populating m_filespec_up. This method will compute the
- /// dependent module list only once. Returns the number of dependent
- /// modules parsed.
- size_t ParseDependentModules();
-
- /// Parses the dynamic symbol table and populates m_dynamic_symbols. The
- /// vector retains the order as found in the object file. Returns the
- /// number of dynamic symbols parsed.
- size_t ParseDynamicSymbols();
-
- /// Populates the symbol table with all non-dynamic linker symbols. This
- /// method will parse the symbols only once. Returns the number of symbols
- /// parsed and a map of address types (used by targets like Arm that have
- /// an alternative ISA mode like Thumb).
- std::pair<unsigned, FileAddressToAddressClassMap>
- ParseSymbolTable(lldb_private::Symtab *symbol_table, lldb::user_id_t start_id,
- lldb_private::Section *symtab);
-
- /// Helper routine for ParseSymbolTable().
- std::pair<unsigned, FileAddressToAddressClassMap>
- ParseSymbols(lldb_private::Symtab *symbol_table, lldb::user_id_t start_id,
- lldb_private::SectionList *section_list,
- const size_t num_symbols,
- const lldb_private::DataExtractor &symtab_data,
- const lldb_private::DataExtractor &strtab_data);
-
- /// Scans the relocation entries and adds a set of artificial symbols to the
- /// given symbol table for each PLT slot. Returns the number of symbols
- /// added.
- unsigned ParseTrampolineSymbols(lldb_private::Symtab *symbol_table,
- lldb::user_id_t start_id,
- const ELFSectionHeaderInfo *rela_hdr,
- lldb::user_id_t section_id);
-
- void ParseUnwindSymbols(lldb_private::Symtab *symbol_table,
- lldb_private::DWARFCallFrameInfo *eh_frame);
-
- /// Relocates debug sections
- unsigned RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr,
- lldb::user_id_t rel_id,
- lldb_private::Symtab *thetab);
-
- unsigned ApplyRelocations(lldb_private::Symtab *symtab,
- const elf::ELFHeader *hdr,
- const elf::ELFSectionHeader *rel_hdr,
- const elf::ELFSectionHeader *symtab_hdr,
- const elf::ELFSectionHeader *debug_hdr,
- lldb_private::DataExtractor &rel_data,
- lldb_private::DataExtractor &symtab_data,
- lldb_private::DataExtractor &debug_data,
- lldb_private::Section *rel_section);
-
- /// Loads the section name string table into m_shstr_data. Returns the
- /// number of bytes constituting the table.
- size_t GetSectionHeaderStringTable();
-
- /// Utility method for looking up a section given its name. Returns the
- /// index of the corresponding section or zero if no section with the given
- /// name can be found (note that section indices are always 1 based, and so
- /// section index 0 is never valid).
- lldb::user_id_t GetSectionIndexByName(const char *name);
-
- /// Returns the section header with the given id or NULL.
- const ELFSectionHeaderInfo *GetSectionHeaderByIndex(lldb::user_id_t id);
-
- /// \name ELF header dump routines
- //@{
- static void DumpELFHeader(lldb_private::Stream *s,
- const elf::ELFHeader &header);
-
- static void DumpELFHeader_e_ident_EI_DATA(lldb_private::Stream *s,
- unsigned char ei_data);
-
- static void DumpELFHeader_e_type(lldb_private::Stream *s,
- elf::elf_half e_type);
- //@}
-
- /// \name ELF program header dump routines
- //@{
- void DumpELFProgramHeaders(lldb_private::Stream *s);
-
- static void DumpELFProgramHeader(lldb_private::Stream *s,
- const elf::ELFProgramHeader &ph);
-
- static void DumpELFProgramHeader_p_type(lldb_private::Stream *s,
- elf::elf_word p_type);
-
- static void DumpELFProgramHeader_p_flags(lldb_private::Stream *s,
- elf::elf_word p_flags);
- //@}
-
- /// \name ELF section header dump routines
- //@{
- void DumpELFSectionHeaders(lldb_private::Stream *s);
-
- static void DumpELFSectionHeader(lldb_private::Stream *s,
- const ELFSectionHeaderInfo &sh);
-
- static void DumpELFSectionHeader_sh_type(lldb_private::Stream *s,
- elf::elf_word sh_type);
-
- static void DumpELFSectionHeader_sh_flags(lldb_private::Stream *s,
- elf::elf_xword sh_flags);
- //@}
-
- /// ELF dependent module dump routine.
- void DumpDependentModules(lldb_private::Stream *s);
-
- /// ELF dump the .dynamic section
- void DumpELFDynamic(lldb_private::Stream *s);
-
- const elf::ELFDynamic *FindDynamicSymbol(unsigned tag);
-
- unsigned PLTRelocationType();
-
- static lldb_private::Status
- RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
- lldb_private::ArchSpec &arch_spec,
- lldb_private::UUID &uuid);
-
- bool AnySegmentHasPhysicalAddress();
-
- /// Takes the .gnu_debugdata and returns the decompressed object file that is
- /// stored within that section.
- ///
- /// \returns either the decompressed object file stored within the
- /// .gnu_debugdata section or \c nullptr if an error occured or if there's no
- /// section with that name.
- std::shared_ptr<ObjectFileELF> GetGnuDebugDataObjectFile();
-
- /// Get the bytes that represent the .dynamic section.
- ///
- /// This function will fetch the data for the .dynamic section in an ELF file.
- /// The PT_DYNAMIC program header will be used to extract the data and this
- /// function will fall back to using the section headers if PT_DYNAMIC isn't
- /// found.
- ///
- /// \return The bytes that represent the string table data or \c std::nullopt
- /// if an error occured.
- std::optional<lldb_private::DataExtractor> GetDynamicData();
-
- /// Get the bytes that represent the dynamic string table data.
- ///
- /// This function will fetch the data for the string table in an ELF file. If
- /// the ELF file is loaded from a file on disk, it will use the section
- /// headers to extract the data and fall back to using the DT_STRTAB and
- /// DT_STRSZ .dynamic entries.
- ///
- /// \return The bytes that represent the string table data or \c std::nullopt
- /// if an error occured.
- std::optional<lldb_private::DataExtractor> GetDynstrData();
+ std::optional<lldb_private::FileSpecList> m_deps_filespec;
+ std::map<std::string, std::vector<std::string>> m_deps_base_members;
};
#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
>From 95336864307c50186bd9dfafb9770c0ce16d4daa Mon Sep 17 00:00:00 2001
From: Dhruv-Srivastava <dhruv.srivastava at ibm.com>
Date: Thu, 10 Oct 2024 06:27:03 -0500
Subject: [PATCH 3/6] clang-format changes
---
.../ObjectFile/XCOFF/ObjectFileXCOFF.h | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
index 5a12d16886489d..2cb73394a0306d 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -1,4 +1,5 @@
-//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++ -*-===//
+//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++
+//-*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -76,7 +77,7 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
bool value_is_offset) override;
bool SetLoadAddressByType(lldb_private::Target &target, lldb::addr_t value,
- bool value_is_offset, int type_id) override;
+ bool value_is_offset, int type_id) override;
lldb::ByteOrder GetByteOrder() const override;
@@ -123,15 +124,15 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
lldb_private::DataExtractor ReadImageData(uint32_t offset, size_t size);
ObjectFileXCOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
- lldb::offset_t data_offset, const lldb_private::FileSpec *file,
- lldb::offset_t offset, lldb::offset_t length);
+ lldb::offset_t data_offset,
+ const lldb_private::FileSpec *file, lldb::offset_t offset,
+ lldb::offset_t length);
ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
- lldb::DataBufferSP header_data_sp,
- const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+ lldb::DataBufferSP header_data_sp,
+ const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
protected:
-
typedef struct xcoff_header {
uint16_t magic;
uint16_t nsects;
@@ -209,8 +210,8 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
} xcoff_sym_csect_aux_entry_t;
static bool ParseXCOFFHeader(lldb_private::DataExtractor &data,
- lldb::offset_t *offset_ptr,
- xcoff_header_t &xcoff_header);
+ lldb::offset_t *offset_ptr,
+ xcoff_header_t &xcoff_header);
bool ParseXCOFFOptionalHeader(lldb_private::DataExtractor &data,
lldb::offset_t *offset_ptr);
bool ParseSectionHeaders(uint32_t offset);
>From 3471f167a8376432571ac17643ed3795a459f017 Mon Sep 17 00:00:00 2001
From: Dhruv-Srivastava <dhruv.srivastava at ibm.com>
Date: Thu, 17 Oct 2024 06:17:14 -0500
Subject: [PATCH 4/6] Added basic support for ObjectFileXCOFF
---
lldb/source/Plugins/ObjectFile/CMakeLists.txt | 1 +
.../Plugins/ObjectFile/XCOFF/CMakeLists.txt | 13 +
.../ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 258 ++++++++++++++++++
.../ObjectFile/XCOFF/ObjectFileXCOFF.h | 140 +---------
.../Shell/ObjectFile/XCOFF/basic-info.yaml | 27 ++
lldb/tools/lldb-server/CMakeLists.txt | 2 +
.../lldb-server/SystemInitializerLLGS.cpp | 3 +
7 files changed, 310 insertions(+), 134 deletions(-)
create mode 100644 lldb/source/Plugins/ObjectFile/XCOFF/CMakeLists.txt
create mode 100644 lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
create mode 100644 lldb/test/Shell/ObjectFile/XCOFF/basic-info.yaml
diff --git a/lldb/source/Plugins/ObjectFile/CMakeLists.txt b/lldb/source/Plugins/ObjectFile/CMakeLists.txt
index 773241c8944c8a..7abd0c96f4fd74 100644
--- a/lldb/source/Plugins/ObjectFile/CMakeLists.txt
+++ b/lldb/source/Plugins/ObjectFile/CMakeLists.txt
@@ -6,5 +6,6 @@ add_subdirectory(Mach-O)
add_subdirectory(Minidump)
add_subdirectory(PDB)
add_subdirectory(PECOFF)
+add_subdirectory(XCOFF)
add_subdirectory(Placeholder)
add_subdirectory(wasm)
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/CMakeLists.txt b/lldb/source/Plugins/ObjectFile/XCOFF/CMakeLists.txt
new file mode 100644
index 00000000000000..8840248574c886
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_lldb_library(lldbPluginObjectFileXCOFF PLUGIN
+ ObjectFileXCOFF.cpp
+
+ LINK_LIBS
+ lldbCore
+ lldbHost
+ lldbSymbol
+ lldbTarget
+ LINK_COMPONENTS
+ BinaryFormat
+ Object
+ Support
+ )
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
new file mode 100644
index 00000000000000..d8c6f9fa840ced
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -0,0 +1,258 @@
+//===-- ObjectFileXCOFF.cpp -------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ObjectFileXCOFF.h"
+
+#include <algorithm>
+#include <cassert>
+#include <unordered_map>
+#include <string.h>
+
+#include "lldb/Utility/FileSpecList.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Progress.h"
+#include "lldb/Core/Section.h"
+#include "lldb/Host/FileSystem.h"
+#include "lldb/Host/LZMA.h"
+#include "lldb/Symbol/DWARFCallFrameInfo.h"
+#include "lldb/Symbol/SymbolContext.h"
+#include "lldb/Target/SectionLoadList.h"
+#include "lldb/Target/Process.h"
+#include "lldb/Target/Target.h"
+#include "lldb/Utility/ArchSpec.h"
+#include "lldb/Utility/DataBufferHeap.h"
+#include "lldb/Utility/LLDBLog.h"
+#include "lldb/Utility/Log.h"
+#include "lldb/Utility/RangeMap.h"
+#include "lldb/Utility/Status.h"
+#include "lldb/Utility/Stream.h"
+#include "lldb/Utility/Timer.h"
+#include "llvm/ADT/IntervalMap.h"
+#include "llvm/ADT/PointerUnion.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/BinaryFormat/XCOFF.h"
+#include "llvm/Object/Decompressor.h"
+#include "llvm/Support/CRC.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Object/XCOFFObjectFile.h"
+
+using namespace llvm;
+using namespace lldb;
+using namespace lldb_private;
+
+LLDB_PLUGIN_DEFINE(ObjectFileXCOFF)
+
+// FIXME: target 64bit at this moment.
+
+// Static methods.
+void ObjectFileXCOFF::Initialize() {
+ PluginManager::RegisterPlugin(GetPluginNameStatic(),
+ GetPluginDescriptionStatic(), CreateInstance,
+ CreateMemoryInstance, GetModuleSpecifications);
+}
+
+void ObjectFileXCOFF::Terminate() {
+ PluginManager::UnregisterPlugin(CreateInstance);
+}
+
+bool UGLY_FLAG_FOR_AIX __attribute__((weak)) = false;
+
+ObjectFile *ObjectFileXCOFF::CreateInstance(const lldb::ModuleSP &module_sp,
+ DataBufferSP data_sp,
+ lldb::offset_t data_offset,
+ const lldb_private::FileSpec *file,
+ lldb::offset_t file_offset,
+ lldb::offset_t length) {
+ if (!data_sp) {
+ data_sp = MapFileData(*file, length, file_offset);
+ if (!data_sp)
+ return nullptr;
+ data_offset = 0;
+ }
+
+ if (!ObjectFileXCOFF::MagicBytesMatch(data_sp, data_offset, length))
+ return nullptr;
+
+ // Update the data to contain the entire file if it doesn't already
+ if (data_sp->GetByteSize() < length) {
+ data_sp = MapFileData(*file, length, file_offset);
+ if (!data_sp)
+ return nullptr;
+ data_offset = 0;
+ }
+ auto objfile_up = std::make_unique<ObjectFileXCOFF>(
+ module_sp, data_sp, data_offset, file, file_offset, length);
+ if (!objfile_up)
+ return nullptr;
+
+ UGLY_FLAG_FOR_AIX = true;
+ return objfile_up.release();
+}
+
+ObjectFile *ObjectFileXCOFF::CreateMemoryInstance(
+ const lldb::ModuleSP &module_sp, WritableDataBufferSP data_sp,
+ const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
+ return nullptr;
+}
+
+size_t ObjectFileXCOFF::GetModuleSpecifications(
+ const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
+ lldb::offset_t data_offset, lldb::offset_t file_offset,
+ lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
+ const size_t initial_count = specs.GetSize();
+
+ if (ObjectFileXCOFF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
+ ArchSpec arch_spec = ArchSpec(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE);
+ ModuleSpec spec(file, arch_spec);
+ spec.GetArchitecture().SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE, llvm::Triple::AIX);
+ specs.Append(spec);
+ }
+ return specs.GetSize() - initial_count;
+}
+
+static uint32_t XCOFFHeaderSizeFromMagic(uint32_t magic) {
+ switch (magic) {
+ /* TODO: 32bit not supported yet
+ case XCOFF::XCOFF32:
+ return sizeof(struct llvm::object::XCOFFFileHeader32);
+ */
+
+ case XCOFF::XCOFF64:
+ return sizeof(struct llvm::object::XCOFFFileHeader64);
+ break;
+
+ default:
+ break;
+ }
+ return 0;
+}
+
+bool ObjectFileXCOFF::MagicBytesMatch(DataBufferSP &data_sp,
+ lldb::addr_t data_offset,
+ lldb::addr_t data_length) {
+ lldb_private::DataExtractor data;
+ data.SetData(data_sp, data_offset, data_length);
+ lldb::offset_t offset = 0;
+ uint16_t magic = data.GetU16(&offset);
+ return XCOFFHeaderSizeFromMagic(magic) != 0;
+}
+
+bool ObjectFileXCOFF::ParseHeader() {
+ return false;
+}
+
+ByteOrder ObjectFileXCOFF::GetByteOrder() const {
+ return eByteOrderBig;
+}
+
+bool ObjectFileXCOFF::IsExecutable() const {
+ return true;
+}
+
+uint32_t ObjectFileXCOFF::GetAddressByteSize() const {
+ return 8;
+}
+
+
+lldb::SymbolType ObjectFileXCOFF::MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
+ return lldb::eSymbolTypeInvalid;
+}
+
+void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
+}
+
+bool ObjectFileXCOFF::IsStripped() {
+ return false;
+}
+
+void ObjectFileXCOFF::CreateSections(SectionList &unified_section_list) {
+}
+
+void ObjectFileXCOFF::Dump(Stream *s) {
+}
+
+ArchSpec ObjectFileXCOFF::GetArchitecture() {
+ ArchSpec arch_spec = ArchSpec(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE);
+ return arch_spec;
+}
+
+UUID ObjectFileXCOFF::GetUUID() {
+ return UUID();
+}
+
+uint32_t ObjectFileXCOFF::ParseDependentModules() {
+ ModuleSP module_sp(GetModule());
+ if (!module_sp)
+ return 0;
+
+ std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
+ if (m_deps_filespec)
+ return m_deps_filespec->GetSize();
+
+ Log *log = GetLog(LLDBLog::Object);
+ LLDB_LOG(log, "this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
+ this, GetModule().get(), GetModule()->GetSpecificationDescription(),
+ m_file.GetPath(), m_binary.get());
+
+ m_deps_filespec = FileSpecList();
+
+ auto ImportFilesOrError = m_binary->getImportFileTable();
+ if (!ImportFilesOrError) {
+ consumeError(ImportFilesOrError.takeError());
+ return 0;
+ }
+
+ return m_deps_filespec->GetSize();
+}
+
+uint32_t ObjectFileXCOFF::GetDependentModules(FileSpecList &files) {
+ auto num_modules = ParseDependentModules();
+ auto original_size = files.GetSize();
+
+ for (unsigned i = 0; i < num_modules; ++i)
+ files.AppendIfUnique(m_deps_filespec->GetFileSpecAtIndex(i));
+
+ return files.GetSize() - original_size;
+}
+
+ObjectFile::Type ObjectFileXCOFF::CalculateType() {
+ return eTypeExecutable;
+}
+
+ObjectFile::Strata ObjectFileXCOFF::CalculateStrata() {
+ return eStrataUnknown;
+}
+
+lldb::WritableDataBufferSP
+ObjectFileXCOFF::MapFileDataWritable(const FileSpec &file, uint64_t Size,
+ uint64_t Offset) {
+ return FileSystem::Instance().CreateWritableDataBuffer(file.GetPath(), Size,
+ Offset);
+}
+
+ObjectFileXCOFF::ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
+ DataBufferSP data_sp, lldb::offset_t data_offset,
+ const FileSpec *file, lldb::offset_t file_offset,
+ lldb::offset_t length)
+ : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset)
+ {
+ if (file)
+ m_file = *file;
+}
+
+ObjectFileXCOFF::ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
+ DataBufferSP header_data_sp,
+ const lldb::ProcessSP &process_sp,
+ addr_t header_addr)
+ : ObjectFile(module_sp, process_sp, header_addr, header_data_sp)
+ {
+}
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
index 2cb73394a0306d..8f56bf080611ef 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -1,5 +1,4 @@
-//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++
-//-*-===//
+//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -63,30 +62,15 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
// PluginInterface protocol
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
- // LLVM RTTI support
- static char ID;
- bool isA(const void *ClassID) const override {
- return ClassID == &ID || ObjectFile::isA(ClassID);
- }
- static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
-
// ObjectFile Protocol.
bool ParseHeader() override;
- bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
- bool value_is_offset) override;
-
- bool SetLoadAddressByType(lldb_private::Target &target, lldb::addr_t value,
- bool value_is_offset, int type_id) override;
-
lldb::ByteOrder GetByteOrder() const override;
bool IsExecutable() const override;
uint32_t GetAddressByteSize() const override;
- lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override;
-
void ParseSymtab(lldb_private::Symtab &symtab) override;
bool IsStripped() override;
@@ -99,146 +83,34 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
lldb_private::UUID GetUUID() override;
- /// Return the contents of the .gnu_debuglink section, if the object file
- /// contains it.
- std::optional<lldb_private::FileSpec> GetDebugLink();
-
uint32_t GetDependentModules(lldb_private::FileSpecList &files) override;
- lldb_private::Address
- GetImageInfoAddress(lldb_private::Target *target) override;
-
- lldb_private::Address GetEntryPointAddress() override;
-
- lldb_private::Address GetBaseAddress() override;
-
ObjectFile::Type CalculateType() override;
ObjectFile::Strata CalculateStrata() override;
- llvm::StringRef
- StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const override;
-
- void RelocateSection(lldb_private::Section *section) override;
-
- lldb_private::DataExtractor ReadImageData(uint32_t offset, size_t size);
-
ObjectFileXCOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
- lldb::offset_t data_offset,
- const lldb_private::FileSpec *file, lldb::offset_t offset,
- lldb::offset_t length);
+ lldb::offset_t data_offset, const lldb_private::FileSpec *file,
+ lldb::offset_t offset, lldb::offset_t length);
ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
- lldb::DataBufferSP header_data_sp,
- const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+ lldb::DataBufferSP header_data_sp,
+ const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
protected:
- typedef struct xcoff_header {
- uint16_t magic;
- uint16_t nsects;
- uint32_t modtime;
- uint64_t symoff;
- uint32_t nsyms;
- uint16_t auxhdrsize;
- uint16_t flags;
- } xcoff_header_t;
-
- typedef struct xcoff_aux_header {
- uint16_t AuxMagic;
- uint16_t Version;
- uint32_t ReservedForDebugger;
- uint64_t TextStartAddr;
- uint64_t DataStartAddr;
- uint64_t TOCAnchorAddr;
- uint16_t SecNumOfEntryPoint;
- uint16_t SecNumOfText;
- uint16_t SecNumOfData;
- uint16_t SecNumOfTOC;
- uint16_t SecNumOfLoader;
- uint16_t SecNumOfBSS;
- uint16_t MaxAlignOfText;
- uint16_t MaxAlignOfData;
- uint16_t ModuleType;
- uint8_t CpuFlag;
- uint8_t CpuType;
- uint8_t TextPageSize;
- uint8_t DataPageSize;
- uint8_t StackPageSize;
- uint8_t FlagAndTDataAlignment;
- uint64_t TextSize;
- uint64_t InitDataSize;
- uint64_t BssDataSize;
- uint64_t EntryPointAddr;
- uint64_t MaxStackSize;
- uint64_t MaxDataSize;
- uint16_t SecNumOfTData;
- uint16_t SecNumOfTBSS;
- uint16_t XCOFF64Flag;
- } xcoff_aux_header_t;
-
- typedef struct section_header {
- char name[8];
- uint64_t phyaddr; // Physical Addr
- uint64_t vmaddr; // Virtual Addr
- uint64_t size; // Section size
- uint64_t offset; // File offset to raw data
- uint64_t reloff; // Offset to relocations
- uint64_t lineoff; // Offset to line table entries
- uint32_t nreloc; // Number of relocation entries
- uint32_t nline; // Number of line table entries
- uint32_t flags;
- } section_header_t;
-
- typedef struct xcoff_symbol {
- uint64_t value;
- uint32_t offset;
- uint16_t sect;
- uint16_t type;
- uint8_t storage;
- uint8_t naux;
- } xcoff_symbol_t;
-
- typedef struct xcoff_sym_csect_aux_entry {
- uint32_t section_or_len_low_byte;
- uint32_t parameter_hash_index;
- uint16_t type_check_sect_num;
- uint8_t symbol_alignment_and_type;
- uint8_t storage_mapping_class;
- uint32_t section_or_len_high_byte;
- uint8_t pad;
- uint8_t aux_type;
- } xcoff_sym_csect_aux_entry_t;
-
- static bool ParseXCOFFHeader(lldb_private::DataExtractor &data,
- lldb::offset_t *offset_ptr,
- xcoff_header_t &xcoff_header);
- bool ParseXCOFFOptionalHeader(lldb_private::DataExtractor &data,
- lldb::offset_t *offset_ptr);
- bool ParseSectionHeaders(uint32_t offset);
-
- std::vector<LoadableData>
- GetLoadableData(lldb_private::Target &target) override;
static lldb::WritableDataBufferSP
MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
uint64_t Offset);
- llvm::StringRef GetSectionName(const section_header_t §);
- static lldb::SectionType GetSectionType(llvm::StringRef sect_name,
- const section_header_t §);
uint32_t ParseDependentModules();
- typedef std::vector<section_header_t> SectionHeaderColl;
private:
- bool CreateBinary();
- xcoff_header_t m_xcoff_header;
- xcoff_aux_header_t m_xcoff_aux_header;
- SectionHeaderColl m_sect_headers;
std::unique_ptr<llvm::object::XCOFFObjectFile> m_binary;
lldb_private::Address m_entry_point_address;
std::optional<lldb_private::FileSpecList> m_deps_filespec;
std::map<std::string, std::vector<std::string>> m_deps_base_members;
};
-#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H
+#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILE_H
diff --git a/lldb/test/Shell/ObjectFile/XCOFF/basic-info.yaml b/lldb/test/Shell/ObjectFile/XCOFF/basic-info.yaml
new file mode 100644
index 00000000000000..761d66a6045d93
--- /dev/null
+++ b/lldb/test/Shell/ObjectFile/XCOFF/basic-info.yaml
@@ -0,0 +1,27 @@
+# RUN: yaml2obj %s -o %t
+# RUN: lldb-test object-file %t | FileCheck %s
+
+# CHECK: Plugin name: xcoff
+# CHECK: Architecture: powerpc64-ibm-aix
+# CHECK: Executable: true
+# CHECK: Stripped: false
+# CHECK: Type: executable
+# CHECK: Strata: unknown
+
+--- !XCOFF
+FileHeader:
+ MagicNumber: 0x1F7
+ NumberOfSections: 1
+ CreationTime: 000000000
+ Flags: 0x0000
+Sections:
+ - Name: .text
+ Address: 0x100000438
+ Size: 0x38
+ FileOffsetToData: 0x0
+ FileOffsetToLineNumbers: 0x0
+ NumberOfLineNumbers: 0x0
+ Flags: [ STYP_TEXT ]
+ SectionData: E8C20000E94204
+StringTable: {}
+...
diff --git a/lldb/tools/lldb-server/CMakeLists.txt b/lldb/tools/lldb-server/CMakeLists.txt
index e6d88a8579885c..8d6843ec5ddd88 100644
--- a/lldb/tools/lldb-server/CMakeLists.txt
+++ b/lldb/tools/lldb-server/CMakeLists.txt
@@ -20,6 +20,8 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
list(APPEND LLDB_PLUGINS lldbPluginObjectFileMachO)
elseif(CMAKE_SYSTEM_NAME MATCHES "Windows")
list(APPEND LLDB_PLUGINS lldbPluginObjectFilePECOFF)
+elseif(CMAKE_SYSTEM_NAME MATCHES "AIX")
+ list(APPEND LLDB_PLUGINS lldbPluginObjectFileXCOFF)
else()
list(APPEND LLDB_PLUGINS lldbPluginObjectFileELF)
endif()
diff --git a/lldb/tools/lldb-server/SystemInitializerLLGS.cpp b/lldb/tools/lldb-server/SystemInitializerLLGS.cpp
index 4233252a84dfc7..0914bf4ab8661a 100644
--- a/lldb/tools/lldb-server/SystemInitializerLLGS.cpp
+++ b/lldb/tools/lldb-server/SystemInitializerLLGS.cpp
@@ -14,6 +14,9 @@ using HostObjectFile = ObjectFileMachO;
#elif defined(_WIN32)
#include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
using HostObjectFile = ObjectFilePECOFF;
+#elif defined(_AIX)
+#include "Plugins/ObjectFile/ELF/ObjectFileXCOFF.h"
+using HostObjectFile = ObjectFileXCOFF;
#else
#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
using HostObjectFile = ObjectFileELF;
>From c8ce1adaa7492d0dfc2f5583e1ec1613866bfba0 Mon Sep 17 00:00:00 2001
From: Dhruv-Srivastava <dhruv.srivastava at ibm.com>
Date: Thu, 17 Oct 2024 06:32:54 -0500
Subject: [PATCH 5/6] clang-format
---
.../ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 113 ++++++++----------
.../ObjectFile/XCOFF/ObjectFileXCOFF.h | 14 +--
2 files changed, 56 insertions(+), 71 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
index d8c6f9fa840ced..9e27124ed023f0 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -1,4 +1,5 @@
-//===-- ObjectFileXCOFF.cpp -------------------------------------------------===//
+//===-- ObjectFileXCOFF.cpp
+//-------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -10,10 +11,9 @@
#include <algorithm>
#include <cassert>
-#include <unordered_map>
#include <string.h>
+#include <unordered_map>
-#include "lldb/Utility/FileSpecList.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
@@ -23,11 +23,12 @@
#include "lldb/Host/LZMA.h"
#include "lldb/Symbol/DWARFCallFrameInfo.h"
#include "lldb/Symbol/SymbolContext.h"
-#include "lldb/Target/SectionLoadList.h"
#include "lldb/Target/Process.h"
+#include "lldb/Target/SectionLoadList.h"
#include "lldb/Target/Target.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/DataBufferHeap.h"
+#include "lldb/Utility/FileSpecList.h"
#include "lldb/Utility/LLDBLog.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/RangeMap.h"
@@ -39,11 +40,11 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/XCOFF.h"
#include "llvm/Object/Decompressor.h"
+#include "llvm/Object/XCOFFObjectFile.h"
#include "llvm/Support/CRC.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Object/XCOFFObjectFile.h"
using namespace llvm;
using namespace lldb;
@@ -67,11 +68,11 @@ void ObjectFileXCOFF::Terminate() {
bool UGLY_FLAG_FOR_AIX __attribute__((weak)) = false;
ObjectFile *ObjectFileXCOFF::CreateInstance(const lldb::ModuleSP &module_sp,
- DataBufferSP data_sp,
- lldb::offset_t data_offset,
- const lldb_private::FileSpec *file,
- lldb::offset_t file_offset,
- lldb::offset_t length) {
+ DataBufferSP data_sp,
+ lldb::offset_t data_offset,
+ const lldb_private::FileSpec *file,
+ lldb::offset_t file_offset,
+ lldb::offset_t length) {
if (!data_sp) {
data_sp = MapFileData(*file, length, file_offset);
if (!data_sp)
@@ -111,9 +112,12 @@ size_t ObjectFileXCOFF::GetModuleSpecifications(
const size_t initial_count = specs.GetSize();
if (ObjectFileXCOFF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
- ArchSpec arch_spec = ArchSpec(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE);
+ ArchSpec arch_spec =
+ ArchSpec(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE);
ModuleSpec spec(file, arch_spec);
- spec.GetArchitecture().SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE, llvm::Triple::AIX);
+ spec.GetArchitecture().SetArchitecture(eArchTypeXCOFF, XCOFF::TCPU_PPC64,
+ LLDB_INVALID_CPUTYPE,
+ llvm::Triple::AIX);
specs.Append(spec);
}
return specs.GetSize() - initial_count;
@@ -121,10 +125,10 @@ size_t ObjectFileXCOFF::GetModuleSpecifications(
static uint32_t XCOFFHeaderSizeFromMagic(uint32_t magic) {
switch (magic) {
- /* TODO: 32bit not supported yet
- case XCOFF::XCOFF32:
- return sizeof(struct llvm::object::XCOFFFileHeader32);
- */
+ /* TODO: 32bit not supported yet
+ case XCOFF::XCOFF32:
+ return sizeof(struct llvm::object::XCOFFFileHeader32);
+ */
case XCOFF::XCOFF64:
return sizeof(struct llvm::object::XCOFFFileHeader64);
@@ -137,57 +141,43 @@ static uint32_t XCOFFHeaderSizeFromMagic(uint32_t magic) {
}
bool ObjectFileXCOFF::MagicBytesMatch(DataBufferSP &data_sp,
- lldb::addr_t data_offset,
- lldb::addr_t data_length) {
- lldb_private::DataExtractor data;
+ lldb::addr_t data_offset,
+ lldb::addr_t data_length) {
+ lldb_private::DataExtractor data;
data.SetData(data_sp, data_offset, data_length);
lldb::offset_t offset = 0;
uint16_t magic = data.GetU16(&offset);
return XCOFFHeaderSizeFromMagic(magic) != 0;
}
-bool ObjectFileXCOFF::ParseHeader() {
- return false;
-}
+bool ObjectFileXCOFF::ParseHeader() { return false; }
-ByteOrder ObjectFileXCOFF::GetByteOrder() const {
- return eByteOrderBig;
-}
+ByteOrder ObjectFileXCOFF::GetByteOrder() const { return eByteOrderBig; }
-bool ObjectFileXCOFF::IsExecutable() const {
- return true;
-}
-
-uint32_t ObjectFileXCOFF::GetAddressByteSize() const {
- return 8;
-}
+bool ObjectFileXCOFF::IsExecutable() const { return true; }
+uint32_t ObjectFileXCOFF::GetAddressByteSize() const { return 8; }
-lldb::SymbolType ObjectFileXCOFF::MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
+lldb::SymbolType
+ObjectFileXCOFF::MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
return lldb::eSymbolTypeInvalid;
}
-void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {
-}
+void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {}
-bool ObjectFileXCOFF::IsStripped() {
- return false;
-}
+bool ObjectFileXCOFF::IsStripped() { return false; }
-void ObjectFileXCOFF::CreateSections(SectionList &unified_section_list) {
-}
+void ObjectFileXCOFF::CreateSections(SectionList &unified_section_list) {}
-void ObjectFileXCOFF::Dump(Stream *s) {
-}
+void ObjectFileXCOFF::Dump(Stream *s) {}
ArchSpec ObjectFileXCOFF::GetArchitecture() {
- ArchSpec arch_spec = ArchSpec(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE);
+ ArchSpec arch_spec =
+ ArchSpec(eArchTypeXCOFF, XCOFF::TCPU_PPC64, LLDB_INVALID_CPUTYPE);
return arch_spec;
}
-UUID ObjectFileXCOFF::GetUUID() {
- return UUID();
-}
+UUID ObjectFileXCOFF::GetUUID() { return UUID(); }
uint32_t ObjectFileXCOFF::ParseDependentModules() {
ModuleSP module_sp(GetModule());
@@ -224,35 +214,30 @@ uint32_t ObjectFileXCOFF::GetDependentModules(FileSpecList &files) {
return files.GetSize() - original_size;
}
-ObjectFile::Type ObjectFileXCOFF::CalculateType() {
- return eTypeExecutable;
-}
+ObjectFile::Type ObjectFileXCOFF::CalculateType() { return eTypeExecutable; }
-ObjectFile::Strata ObjectFileXCOFF::CalculateStrata() {
- return eStrataUnknown;
-}
+ObjectFile::Strata ObjectFileXCOFF::CalculateStrata() { return eStrataUnknown; }
lldb::WritableDataBufferSP
ObjectFileXCOFF::MapFileDataWritable(const FileSpec &file, uint64_t Size,
- uint64_t Offset) {
+ uint64_t Offset) {
return FileSystem::Instance().CreateWritableDataBuffer(file.GetPath(), Size,
Offset);
}
ObjectFileXCOFF::ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
- DataBufferSP data_sp, lldb::offset_t data_offset,
- const FileSpec *file, lldb::offset_t file_offset,
- lldb::offset_t length)
- : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset)
- {
+ DataBufferSP data_sp,
+ lldb::offset_t data_offset,
+ const FileSpec *file,
+ lldb::offset_t file_offset,
+ lldb::offset_t length)
+ : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset) {
if (file)
m_file = *file;
}
ObjectFileXCOFF::ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
- DataBufferSP header_data_sp,
- const lldb::ProcessSP &process_sp,
- addr_t header_addr)
- : ObjectFile(module_sp, process_sp, header_addr, header_data_sp)
- {
-}
+ DataBufferSP header_data_sp,
+ const lldb::ProcessSP &process_sp,
+ addr_t header_addr)
+ : ObjectFile(module_sp, process_sp, header_addr, header_data_sp) {}
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
index 8f56bf080611ef..44576fb01ddcaf 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -1,4 +1,5 @@
-//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++ -*-===//
+//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++
+//-*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -90,15 +91,15 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
ObjectFile::Strata CalculateStrata() override;
ObjectFileXCOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
- lldb::offset_t data_offset, const lldb_private::FileSpec *file,
- lldb::offset_t offset, lldb::offset_t length);
+ lldb::offset_t data_offset,
+ const lldb_private::FileSpec *file, lldb::offset_t offset,
+ lldb::offset_t length);
ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
- lldb::DataBufferSP header_data_sp,
- const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+ lldb::DataBufferSP header_data_sp,
+ const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
protected:
-
static lldb::WritableDataBufferSP
MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
uint64_t Offset);
@@ -106,7 +107,6 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
uint32_t ParseDependentModules();
private:
-
std::unique_ptr<llvm::object::XCOFFObjectFile> m_binary;
lldb_private::Address m_entry_point_address;
std::optional<lldb_private::FileSpecList> m_deps_filespec;
>From 751c2caef5916ec8349baaac39fb60c0e3c33efe Mon Sep 17 00:00:00 2001
From: Dhruv-Srivastava <dhruv.srivastava at ibm.com>
Date: Thu, 17 Oct 2024 11:07:37 -0500
Subject: [PATCH 6/6] Review comment changes
---
.../ObjectFile/XCOFF/ObjectFileXCOFF.cpp | 55 +------------------
.../ObjectFile/XCOFF/ObjectFileXCOFF.h | 10 ----
2 files changed, 2 insertions(+), 63 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
index 9e27124ed023f0..087d0348267001 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.cpp
@@ -11,7 +11,7 @@
#include <algorithm>
#include <cassert>
-#include <string.h>
+#include <cstring>
#include <unordered_map>
#include "lldb/Core/Module.h"
@@ -20,11 +20,8 @@
#include "lldb/Core/Progress.h"
#include "lldb/Core/Section.h"
#include "lldb/Host/FileSystem.h"
-#include "lldb/Host/LZMA.h"
-#include "lldb/Symbol/DWARFCallFrameInfo.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Target/Process.h"
-#include "lldb/Target/SectionLoadList.h"
#include "lldb/Target/Target.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/DataBufferHeap.h"
@@ -34,16 +31,9 @@
#include "lldb/Utility/RangeMap.h"
#include "lldb/Utility/Status.h"
#include "lldb/Utility/Stream.h"
-#include "lldb/Utility/Timer.h"
-#include "llvm/ADT/IntervalMap.h"
-#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/XCOFF.h"
-#include "llvm/Object/Decompressor.h"
#include "llvm/Object/XCOFFObjectFile.h"
-#include "llvm/Support/CRC.h"
-#include "llvm/Support/FormatVariadic.h"
-#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
using namespace llvm;
@@ -65,8 +55,6 @@ void ObjectFileXCOFF::Terminate() {
PluginManager::UnregisterPlugin(CreateInstance);
}
-bool UGLY_FLAG_FOR_AIX __attribute__((weak)) = false;
-
ObjectFile *ObjectFileXCOFF::CreateInstance(const lldb::ModuleSP &module_sp,
DataBufferSP data_sp,
lldb::offset_t data_offset,
@@ -95,7 +83,6 @@ ObjectFile *ObjectFileXCOFF::CreateInstance(const lldb::ModuleSP &module_sp,
if (!objfile_up)
return nullptr;
- UGLY_FLAG_FOR_AIX = true;
return objfile_up.release();
}
@@ -158,11 +145,6 @@ bool ObjectFileXCOFF::IsExecutable() const { return true; }
uint32_t ObjectFileXCOFF::GetAddressByteSize() const { return 8; }
-lldb::SymbolType
-ObjectFileXCOFF::MapSymbolType(llvm::object::SymbolRef::Type sym_type) {
- return lldb::eSymbolTypeInvalid;
-}
-
void ObjectFileXCOFF::ParseSymtab(Symtab &lldb_symtab) {}
bool ObjectFileXCOFF::IsStripped() { return false; }
@@ -179,40 +161,7 @@ ArchSpec ObjectFileXCOFF::GetArchitecture() {
UUID ObjectFileXCOFF::GetUUID() { return UUID(); }
-uint32_t ObjectFileXCOFF::ParseDependentModules() {
- ModuleSP module_sp(GetModule());
- if (!module_sp)
- return 0;
-
- std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
- if (m_deps_filespec)
- return m_deps_filespec->GetSize();
-
- Log *log = GetLog(LLDBLog::Object);
- LLDB_LOG(log, "this = {0}, module = {1} ({2}), file = {3}, binary = {4}",
- this, GetModule().get(), GetModule()->GetSpecificationDescription(),
- m_file.GetPath(), m_binary.get());
-
- m_deps_filespec = FileSpecList();
-
- auto ImportFilesOrError = m_binary->getImportFileTable();
- if (!ImportFilesOrError) {
- consumeError(ImportFilesOrError.takeError());
- return 0;
- }
-
- return m_deps_filespec->GetSize();
-}
-
-uint32_t ObjectFileXCOFF::GetDependentModules(FileSpecList &files) {
- auto num_modules = ParseDependentModules();
- auto original_size = files.GetSize();
-
- for (unsigned i = 0; i < num_modules; ++i)
- files.AppendIfUnique(m_deps_filespec->GetFileSpecAtIndex(i));
-
- return files.GetSize() - original_size;
-}
+uint32_t ObjectFileXCOFF::GetDependentModules(FileSpecList &files) { return 0; }
ObjectFile::Type ObjectFileXCOFF::CalculateType() { return eTypeExecutable; }
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
index 44576fb01ddcaf..3a33b97b9e8da1 100644
--- a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -58,8 +58,6 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
lldb::addr_t length);
- static lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type);
-
// PluginInterface protocol
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
@@ -103,14 +101,6 @@ class ObjectFileXCOFF : public lldb_private::ObjectFile {
static lldb::WritableDataBufferSP
MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
uint64_t Offset);
-
- uint32_t ParseDependentModules();
-
-private:
- std::unique_ptr<llvm::object::XCOFFObjectFile> m_binary;
- lldb_private::Address m_entry_point_address;
- std::optional<lldb_private::FileSpecList> m_deps_filespec;
- std::map<std::string, std::vector<std::string>> m_deps_base_members;
};
#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILE_H
More information about the lldb-commits
mailing list