Path: blob/main/contrib/llvm-project/lldb/source/Plugins/ObjectFile/COFF/ObjectFileCOFF.h
39644 views
//===-- ObjectFileCOFF.h -------------------------------------- -*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_COFF_OBJECTFILECOFF_H9#define LLDB_SOURCE_PLUGINS_OBJECTFILE_COFF_OBJECTFILECOFF_H1011#include "lldb/Symbol/ObjectFile.h"1213#include "llvm/Object/COFF.h"1415/// \class ObjectFileELF16/// Generic COFF object file reader.17///18/// This class provides a generic COFF reader plugin implementing the ObjectFile19/// protocol. Assumes that the COFF object format is a Microsoft style COFF20/// rather than the full generality afforded by it.21class ObjectFileCOFF : public lldb_private::ObjectFile {22std::unique_ptr<llvm::object::COFFObjectFile> m_object;23lldb_private::UUID m_uuid;2425ObjectFileCOFF(std::unique_ptr<llvm::object::COFFObjectFile> object,26const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,27lldb::offset_t data_offset, const lldb_private::FileSpec *file,28lldb::offset_t file_offset, lldb::offset_t length)29: ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),30m_object(std::move(object)) {}3132public:33~ObjectFileCOFF() override;3435static void Initialize();36static void Terminate();3738static llvm::StringRef GetPluginNameStatic() { return "COFF"; }39static llvm::StringRef GetPluginDescriptionStatic() {40return "COFF Object File Reader";41}4243static lldb_private::ObjectFile *44CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,45lldb::offset_t data_offset, const lldb_private::FileSpec *file,46lldb::offset_t file_offset, lldb::offset_t length);4748static lldb_private::ObjectFile *49CreateMemoryInstance(const lldb::ModuleSP &module_sp,50lldb::WritableDataBufferSP data_sp,51const lldb::ProcessSP &process_sp, lldb::addr_t header);5253static size_t GetModuleSpecifications(const lldb_private::FileSpec &file,54lldb::DataBufferSP &data_sp,55lldb::offset_t data_offset,56lldb::offset_t file_offset,57lldb::offset_t length,58lldb_private::ModuleSpecList &specs);5960// LLVM RTTI support61static char ID;62bool isA(const void *ClassID) const override {63return ClassID == &ID || ObjectFile::isA(ClassID);64}65static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }6667// PluginInterface protocol68llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }6970// ObjectFile protocol71void Dump(lldb_private::Stream *stream) override;7273uint32_t GetAddressByteSize() const override;7475uint32_t GetDependentModules(lldb_private::FileSpecList &specs) override {76return 0;77}7879bool IsExecutable() const override {80// COFF is an object file format only, it cannot host an executable.81return false;82}8384lldb_private::ArchSpec GetArchitecture() override;8586void CreateSections(lldb_private::SectionList &) override;8788void ParseSymtab(lldb_private::Symtab &) override;8990bool IsStripped() override {91// FIXME see if there is a good way to identify a /Z7 v /Zi or /ZI build.92return false;93}9495lldb_private::UUID GetUUID() override { return m_uuid; }9697lldb::ByteOrder GetByteOrder() const override {98// Microsoft always uses little endian.99return lldb::ByteOrder::eByteOrderLittle;100}101102bool ParseHeader() override;103104lldb_private::ObjectFile::Type CalculateType() override {105// COFF is an object file format only, it cannot host an executable.106return lldb_private::ObjectFile::eTypeObjectFile;107}108109lldb_private::ObjectFile::Strata CalculateStrata() override {110// FIXME the object file may correspond to a kernel image.111return lldb_private::ObjectFile::eStrataUser;112}113};114115#endif116117118