clang 20.0.0 (based on r547379) from build 12806354. Bug: http://b/379133546 Test: N/A Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
153 lines
5.7 KiB
C++
153 lines
5.7 KiB
C++
//===-- ObjectContainer.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_SYMBOL_OBJECTCONTAINER_H
|
|
#define LLDB_SYMBOL_OBJECTCONTAINER_H
|
|
|
|
#include "lldb/Core/ModuleChild.h"
|
|
#include "lldb/Core/PluginInterface.h"
|
|
#include "lldb/Utility/DataExtractor.h"
|
|
#include "lldb/Utility/Endian.h"
|
|
#include "lldb/Utility/FileSpec.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
/// \class ObjectContainer ObjectContainer.h "lldb/Symbol/ObjectContainer.h"
|
|
/// A plug-in interface definition class for object containers.
|
|
///
|
|
/// Object containers contain object files from one or more architectures, and
|
|
/// also can contain one or more named objects.
|
|
///
|
|
/// Typical object containers are static libraries (.a files) that contain
|
|
/// multiple named object files, and universal files that contain multiple
|
|
/// architectures.
|
|
class ObjectContainer : public PluginInterface, public ModuleChild {
|
|
public:
|
|
/// Construct with a parent module, offset, and header data.
|
|
///
|
|
/// Object files belong to modules and a valid module must be supplied upon
|
|
/// construction. The at an offset within a file for objects that contain
|
|
/// more than one architecture or object.
|
|
ObjectContainer(const lldb::ModuleSP &module_sp, const FileSpec *file,
|
|
lldb::offset_t file_offset, lldb::offset_t length,
|
|
lldb::DataBufferSP data_sp, lldb::offset_t data_offset);
|
|
|
|
/// Destructor.
|
|
///
|
|
/// The destructor is virtual since this class is designed to be inherited
|
|
/// from by the plug-in instance.
|
|
~ObjectContainer() override = default;
|
|
|
|
/// Gets the architecture given an index.
|
|
///
|
|
/// Copies the architecture specification for index \a idx.
|
|
///
|
|
/// \param[in] idx
|
|
/// The architecture index to extract.
|
|
///
|
|
/// \param[out] arch
|
|
/// A architecture object that will be filled in if \a idx is a
|
|
/// architecture valid index.
|
|
///
|
|
/// \return
|
|
/// Returns \b true if \a idx is valid and \a arch has been
|
|
/// filled in, \b false otherwise.
|
|
///
|
|
/// \see ObjectContainer::GetNumArchitectures() const
|
|
virtual bool GetArchitectureAtIndex(uint32_t idx, ArchSpec &arch) const {
|
|
return false;
|
|
}
|
|
|
|
/// Returns the offset into a file at which this object resides.
|
|
///
|
|
/// Some files contain many object files, and this function allows access to
|
|
/// an object's offset within the file.
|
|
///
|
|
/// \return
|
|
/// The offset in bytes into the file. Defaults to zero for
|
|
/// simple object files that a represented by an entire file.
|
|
virtual lldb::addr_t GetOffset() const { return m_offset; }
|
|
|
|
virtual lldb::addr_t GetByteSize() const { return m_length; }
|
|
|
|
/// Get the number of objects within this object file (archives).
|
|
///
|
|
/// \return
|
|
/// Zero for object files that are not archives, or the number
|
|
/// of objects contained in the archive.
|
|
virtual size_t GetNumObjects() const { return 0; }
|
|
|
|
/// Get the number of architectures in this object file.
|
|
///
|
|
/// The default implementation returns 1 as for object files that contain a
|
|
/// single architecture. ObjectContainer instances that contain more than
|
|
/// one architecture should override this function and return an appropriate
|
|
/// value.
|
|
///
|
|
/// \return
|
|
/// The number of architectures contained in this object file.
|
|
virtual size_t GetNumArchitectures() const { return 0; }
|
|
|
|
/// Attempts to parse the object header.
|
|
///
|
|
/// This function is used as a test to see if a given plug-in instance can
|
|
/// parse the header data already contained in ObjectContainer::m_data. If
|
|
/// an object file parser does not recognize that magic bytes in a header,
|
|
/// false should be returned and the next plug-in can attempt to parse an
|
|
/// object file.
|
|
///
|
|
/// \return
|
|
/// Returns \b true if the header was parsed successfully, \b
|
|
/// false otherwise.
|
|
virtual bool ParseHeader() = 0;
|
|
|
|
/// Selects an architecture in an object file.
|
|
///
|
|
/// Object files that contain a single architecture should verify that the
|
|
/// specified \a arch matches the architecture in the object file and return
|
|
/// \b true or \b false accordingly.
|
|
///
|
|
/// Object files that contain more than one architecture should attempt to
|
|
/// select that architecture, and if successful, clear out any previous
|
|
/// state from any previously selected architecture and prepare to return
|
|
/// information for the new architecture.
|
|
///
|
|
/// \return
|
|
/// Returns a pointer to the object file of the requested \a
|
|
/// arch and optional \a name. Returns nullptr of no such object
|
|
/// file exists in the container.
|
|
virtual lldb::ObjectFileSP GetObjectFile(const FileSpec *file) = 0;
|
|
|
|
static lldb::ObjectContainerSP
|
|
FindPlugin(const lldb::ModuleSP &module_sp, const lldb::ProcessSP &process_sp,
|
|
lldb::addr_t header_addr, lldb::WritableDataBufferSP file_data_sp);
|
|
|
|
protected:
|
|
/// The file that represents this container objects (which can be different
|
|
/// from the module's file).
|
|
FileSpec m_file;
|
|
|
|
/// The offset in bytes into the file, or the address in memory
|
|
lldb::addr_t m_offset;
|
|
|
|
/// The size in bytes if known (can be zero).
|
|
lldb::addr_t m_length;
|
|
|
|
/// The data for this object file so things can be parsed lazily.
|
|
DataExtractor m_data;
|
|
|
|
private:
|
|
ObjectContainer(const ObjectContainer &) = delete;
|
|
const ObjectContainer &operator=(const ObjectContainer &) = delete;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SYMBOL_OBJECTCONTAINER_H
|