diff options
| author | Ed Maste <emaste@FreeBSD.org> | 2013-08-23 17:46:38 +0000 |
|---|---|---|
| committer | Ed Maste <emaste@FreeBSD.org> | 2013-08-23 17:46:38 +0000 |
| commit | f034231a6a1fd5d6395206c1651de8cd9402cca3 (patch) | |
| tree | f561dabc721ad515599172c16da3a4400b7f4aec /include/lldb/Expression/Materializer.h | |
Notes
Diffstat (limited to 'include/lldb/Expression/Materializer.h')
| -rw-r--r-- | include/lldb/Expression/Materializer.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/include/lldb/Expression/Materializer.h b/include/lldb/Expression/Materializer.h new file mode 100644 index 0000000000000..208a081339234 --- /dev/null +++ b/include/lldb/Expression/Materializer.h @@ -0,0 +1,173 @@ +//===-- 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 |
