1 //===-- ObjectFileXCOFF.h --------------------------------------- -*- C++ 2 //-*-===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H 11 #define LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H 12 13 #include "lldb/Symbol/ObjectFile.h" 14 #include "lldb/Utility/ArchSpec.h" 15 #include "lldb/Utility/FileSpec.h" 16 #include "lldb/Utility/UUID.h" 17 #include "lldb/lldb-private.h" 18 #include "llvm/Object/XCOFFObjectFile.h" 19 #include <cstdint> 20 #include <vector> 21 22 /// \class ObjectFileXCOFF 23 /// Generic XCOFF object file reader. 24 /// 25 /// This class provides a generic XCOFF (32/64 bit) reader plugin implementing 26 /// the ObjectFile protocol. 27 class ObjectFileXCOFF : public lldb_private::ObjectFile { 28 public: 29 // Static Functions 30 static void Initialize(); 31 32 static void Terminate(); 33 GetPluginNameStatic()34 static llvm::StringRef GetPluginNameStatic() { return "xcoff"; } 35 GetPluginDescriptionStatic()36 static llvm::StringRef GetPluginDescriptionStatic() { 37 return "XCOFF object file reader."; 38 } 39 40 static lldb_private::ObjectFile * 41 CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 42 lldb::offset_t data_offset, const lldb_private::FileSpec *file, 43 lldb::offset_t file_offset, lldb::offset_t length); 44 45 static lldb_private::ObjectFile *CreateMemoryInstance( 46 const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp, 47 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 48 49 static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 50 lldb::DataBufferSP &data_sp, 51 lldb::offset_t data_offset, 52 lldb::offset_t file_offset, 53 lldb::offset_t length, 54 lldb_private::ModuleSpecList &specs); 55 56 static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset, 57 lldb::addr_t length); 58 59 // PluginInterface protocol GetPluginName()60 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 61 62 // ObjectFile Protocol. 63 bool ParseHeader() override; 64 65 lldb::ByteOrder GetByteOrder() const override; 66 67 bool IsExecutable() const override; 68 69 uint32_t GetAddressByteSize() const override; 70 71 lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override; 72 73 void ParseSymtab(lldb_private::Symtab &symtab) override; 74 75 bool IsStripped() override; 76 77 void CreateSections(lldb_private::SectionList &unified_section_list) override; 78 79 void Dump(lldb_private::Stream *s) override; 80 81 lldb_private::ArchSpec GetArchitecture() override; 82 83 lldb_private::UUID GetUUID() override; 84 85 uint32_t GetDependentModules(lldb_private::FileSpecList &files) override; 86 87 ObjectFile::Type CalculateType() override; 88 89 ObjectFile::Strata CalculateStrata() override; 90 91 ObjectFileXCOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp, 92 lldb::offset_t data_offset, 93 const lldb_private::FileSpec *file, lldb::offset_t offset, 94 lldb::offset_t length); 95 96 ObjectFileXCOFF(const lldb::ModuleSP &module_sp, 97 lldb::DataBufferSP header_data_sp, 98 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 99 100 protected: 101 static lldb::WritableDataBufferSP 102 MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size, 103 uint64_t Offset); 104 105 private: 106 bool CreateBinary(); 107 template <typename T> 108 void 109 CreateSectionsWithBitness(lldb_private::SectionList &unified_section_list); 110 111 struct XCOFF32 { 112 using SectionHeader = llvm::object::XCOFFSectionHeader32; 113 static constexpr bool Is64Bit = false; 114 }; 115 struct XCOFF64 { 116 using SectionHeader = llvm::object::XCOFFSectionHeader64; 117 static constexpr bool Is64Bit = true; 118 }; 119 120 std::unique_ptr<llvm::object::XCOFFObjectFile> m_binary; 121 }; 122 123 #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILE_H 124