Materializer.h revision 0f0551e67d8ea8d63ace5456f7d42d951827b017
1//===-- Materializer.h ------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef lldb_Materializer_h 11#define lldb_Materializer_h 12 13#include "lldb/lldb-private-types.h" 14#include "lldb/Core/Error.h" 15#include "lldb/Expression/IRMemoryMap.h" 16#include "lldb/Host/Mutex.h" 17#include "lldb/Symbol/SymbolContext.h" 18 19#include <vector> 20 21namespace lldb_private 22{ 23 24class Materializer 25{ 26public: 27 Materializer (); 28 ~Materializer (); 29 30 class Dematerializer 31 { 32 public: 33 Dematerializer () : 34 m_materializer(NULL), 35 m_map(NULL), 36 m_process_address(LLDB_INVALID_ADDRESS) 37 { 38 } 39 40 ~Dematerializer () 41 { 42 Wipe (); 43 } 44 45 void Dematerialize (Error &err, 46 lldb::ClangExpressionVariableSP &result_sp, 47 lldb::addr_t frame_top, 48 lldb::addr_t frame_bottom); 49 50 void Wipe (); 51 52 bool IsValid () 53 { 54 return m_materializer && m_map && (m_process_address != LLDB_INVALID_ADDRESS); 55 } 56 private: 57 friend class Materializer; 58 59 Dematerializer (Materializer &materializer, 60 lldb::StackFrameSP &frame_sp, 61 IRMemoryMap &map, 62 lldb::addr_t process_address) : 63 m_materializer(&materializer), 64 m_frame_wp(frame_sp), 65 m_map(&map), 66 m_process_address(process_address) 67 { 68 } 69 70 Materializer *m_materializer; 71 lldb::StackFrameWP m_frame_wp; 72 IRMemoryMap *m_map; 73 lldb::addr_t m_process_address; 74 }; 75 76 typedef STD_SHARED_PTR(Dematerializer) DematerializerSP; 77 typedef STD_WEAK_PTR(Dematerializer) DematerializerWP; 78 79 DematerializerSP Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err); 80 81 uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err); 82 uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err); 83 uint32_t AddResultVariable (const TypeFromUser &type, bool is_lvalue, bool keep_in_memory, Error &err); 84 uint32_t AddSymbol (const Symbol &symbol_sp, Error &err); 85 uint32_t AddRegister (const RegisterInfo ®ister_info, Error &err); 86 87 uint32_t GetStructAlignment () 88 { 89 return m_struct_alignment; 90 } 91 92 uint32_t GetStructByteSize () 93 { 94 return m_current_offset; 95 } 96 97 uint32_t GetResultOffset () 98 { 99 if (m_result_entity) 100 return m_result_entity->GetOffset(); 101 else 102 return UINT32_MAX; 103 } 104 105 class Entity 106 { 107 public: 108 Entity () : 109 m_alignment(1), 110 m_size(0), 111 m_offset(0) 112 { 113 } 114 115 virtual ~Entity () 116 { 117 } 118 119 virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0; 120 virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, 121 lldb::addr_t frame_top, lldb::addr_t frame_bottom, Error &err) = 0; 122 virtual void DumpToLog (IRMemoryMap &map, lldb::addr_t process_address, Log *log) = 0; 123 virtual void Wipe (IRMemoryMap &map, lldb::addr_t process_address) = 0; 124 125 uint32_t GetAlignment () 126 { 127 return m_alignment; 128 } 129 130 uint32_t GetSize () 131 { 132 return m_size; 133 } 134 135 uint32_t GetOffset () 136 { 137 return m_offset; 138 } 139 140 void SetOffset (uint32_t offset) 141 { 142 m_offset = offset; 143 } 144 protected: 145 void SetSizeAndAlignmentFromType (ClangASTType &type); 146 147 uint32_t m_alignment; 148 uint32_t m_size; 149 uint32_t m_offset; 150 }; 151 152private: 153 uint32_t AddStructMember (Entity &entity); 154 155 typedef STD_UNIQUE_PTR(Entity) EntityUP; 156 typedef std::vector<EntityUP> EntityVector; 157 158 unsigned m_result_index; 159 DematerializerWP m_dematerializer_wp; 160 EntityVector m_entities; 161 Entity *m_result_entity; 162 uint32_t m_current_offset; 163 uint32_t m_struct_alignment; 164}; 165 166} 167 168#endif 169