summaryrefslogtreecommitdiff
path: root/include/lldb/Expression/Materializer.h
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2013-08-23 17:46:38 +0000
committerEd Maste <emaste@FreeBSD.org>2013-08-23 17:46:38 +0000
commitf034231a6a1fd5d6395206c1651de8cd9402cca3 (patch)
treef561dabc721ad515599172c16da3a4400b7f4aec /include/lldb/Expression/Materializer.h
Notes
Diffstat (limited to 'include/lldb/Expression/Materializer.h')
-rw-r--r--include/lldb/Expression/Materializer.h173
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 &register_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