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.
27class ObjectFileXCOFF : public lldb_private::ObjectFile {
28public:
29 // Static Functions
30 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 protocol
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
100protected:
101 static lldb::WritableDataBufferSP
102 MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
103 uint64_t Offset);
104
105private:
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

source code of lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h