124 lines · c
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-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H11#define LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H12 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 ObjectFileXCOFF23/// Generic XCOFF object file reader.24///25/// This class provides a generic XCOFF (32/64 bit) reader plugin implementing26/// the ObjectFile protocol.27class ObjectFileXCOFF : public lldb_private::ObjectFile {28public:29 // Static Functions30 static void Initialize();31 32 static void Terminate();33 34 static llvm::StringRef GetPluginNameStatic() { return "xcoff"; }35 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 protocol60 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 100protected:101 static lldb::WritableDataBufferSP102 MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,103 uint64_t Offset);104 105private:106 bool CreateBinary();107 template <typename T>108 void109 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_H124