mirror of
https://github.com/opnsense/src.git
synced 2026-03-02 21:31:02 -05:00
(A number of files not required for the FreeBSD build have been removed.) Sponsored by: DARPA, AFRL
173 lines
4.8 KiB
C++
173 lines
4.8 KiB
C++
//===-- Materializer.h ------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef lldb_Materializer_h
|
|
#define lldb_Materializer_h
|
|
|
|
#include "lldb/lldb-private-types.h"
|
|
#include "lldb/Core/Error.h"
|
|
#include "lldb/Expression/IRMemoryMap.h"
|
|
#include "lldb/Host/Mutex.h"
|
|
#include "lldb/Symbol/SymbolContext.h"
|
|
#include "lldb/Target/StackFrame.h"
|
|
|
|
#include <vector>
|
|
|
|
namespace lldb_private
|
|
{
|
|
|
|
class Materializer
|
|
{
|
|
public:
|
|
Materializer ();
|
|
~Materializer ();
|
|
|
|
class Dematerializer
|
|
{
|
|
public:
|
|
Dematerializer () :
|
|
m_materializer(NULL),
|
|
m_map(NULL),
|
|
m_process_address(LLDB_INVALID_ADDRESS)
|
|
{
|
|
}
|
|
|
|
~Dematerializer ()
|
|
{
|
|
Wipe ();
|
|
}
|
|
|
|
void Dematerialize (Error &err,
|
|
lldb::ClangExpressionVariableSP &result_sp,
|
|
lldb::addr_t frame_top,
|
|
lldb::addr_t frame_bottom);
|
|
|
|
void Wipe ();
|
|
|
|
bool IsValid ()
|
|
{
|
|
return m_materializer && m_map && (m_process_address != LLDB_INVALID_ADDRESS);
|
|
}
|
|
private:
|
|
friend class Materializer;
|
|
|
|
Dematerializer (Materializer &materializer,
|
|
lldb::StackFrameSP &frame_sp,
|
|
IRMemoryMap &map,
|
|
lldb::addr_t process_address) :
|
|
m_materializer(&materializer),
|
|
m_map(&map),
|
|
m_process_address(process_address)
|
|
{
|
|
if (frame_sp)
|
|
{
|
|
m_thread_wp = frame_sp->GetThread();
|
|
m_stack_id = frame_sp->GetStackID();
|
|
}
|
|
}
|
|
|
|
Materializer *m_materializer;
|
|
lldb::ThreadWP m_thread_wp;
|
|
StackID m_stack_id;
|
|
IRMemoryMap *m_map;
|
|
lldb::addr_t m_process_address;
|
|
};
|
|
|
|
typedef std::shared_ptr<Dematerializer> DematerializerSP;
|
|
typedef std::weak_ptr<Dematerializer> DematerializerWP;
|
|
|
|
DematerializerSP Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err);
|
|
|
|
uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err);
|
|
uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err);
|
|
uint32_t AddResultVariable (const TypeFromUser &type, bool is_lvalue, bool keep_in_memory, Error &err);
|
|
uint32_t AddSymbol (const Symbol &symbol_sp, Error &err);
|
|
uint32_t AddRegister (const RegisterInfo ®ister_info, Error &err);
|
|
|
|
uint32_t GetStructAlignment ()
|
|
{
|
|
return m_struct_alignment;
|
|
}
|
|
|
|
uint32_t GetStructByteSize ()
|
|
{
|
|
return m_current_offset;
|
|
}
|
|
|
|
uint32_t GetResultOffset ()
|
|
{
|
|
if (m_result_entity)
|
|
return m_result_entity->GetOffset();
|
|
else
|
|
return UINT32_MAX;
|
|
}
|
|
|
|
class Entity
|
|
{
|
|
public:
|
|
Entity () :
|
|
m_alignment(1),
|
|
m_size(0),
|
|
m_offset(0)
|
|
{
|
|
}
|
|
|
|
virtual ~Entity ()
|
|
{
|
|
}
|
|
|
|
virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
|
|
virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address,
|
|
lldb::addr_t frame_top, lldb::addr_t frame_bottom, Error &err) = 0;
|
|
virtual void DumpToLog (IRMemoryMap &map, lldb::addr_t process_address, Log *log) = 0;
|
|
virtual void Wipe (IRMemoryMap &map, lldb::addr_t process_address) = 0;
|
|
|
|
uint32_t GetAlignment ()
|
|
{
|
|
return m_alignment;
|
|
}
|
|
|
|
uint32_t GetSize ()
|
|
{
|
|
return m_size;
|
|
}
|
|
|
|
uint32_t GetOffset ()
|
|
{
|
|
return m_offset;
|
|
}
|
|
|
|
void SetOffset (uint32_t offset)
|
|
{
|
|
m_offset = offset;
|
|
}
|
|
protected:
|
|
void SetSizeAndAlignmentFromType (ClangASTType &type);
|
|
|
|
uint32_t m_alignment;
|
|
uint32_t m_size;
|
|
uint32_t m_offset;
|
|
};
|
|
|
|
private:
|
|
uint32_t AddStructMember (Entity &entity);
|
|
|
|
typedef std::unique_ptr<Entity> EntityUP;
|
|
typedef std::vector<EntityUP> EntityVector;
|
|
|
|
DematerializerWP m_dematerializer_wp;
|
|
EntityVector m_entities;
|
|
Entity *m_result_entity;
|
|
uint32_t m_current_offset;
|
|
uint32_t m_struct_alignment;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|