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 #include "lldb/Target/StackFrame.h" 19 20 #include <vector> 21 22 namespace lldb_private 23 { 24 25 class Materializer 26 { 27 public: 28 Materializer (); 29 ~Materializer (); 30 31 class Dematerializer 32 { 33 public: Dematerializer()34 Dematerializer () : 35 m_materializer(NULL), 36 m_map(NULL), 37 m_process_address(LLDB_INVALID_ADDRESS) 38 { 39 } 40 ~Dematerializer()41 ~Dematerializer () 42 { 43 Wipe (); 44 } 45 46 void Dematerialize (Error &err, 47 lldb::ClangExpressionVariableSP &result_sp, 48 lldb::addr_t frame_top, 49 lldb::addr_t frame_bottom); 50 51 void Wipe (); 52 IsValid()53 bool IsValid () 54 { 55 return m_materializer && m_map && (m_process_address != LLDB_INVALID_ADDRESS); 56 } 57 private: 58 friend class Materializer; 59 Dematerializer(Materializer & materializer,lldb::StackFrameSP & frame_sp,IRMemoryMap & map,lldb::addr_t process_address)60 Dematerializer (Materializer &materializer, 61 lldb::StackFrameSP &frame_sp, 62 IRMemoryMap &map, 63 lldb::addr_t process_address) : 64 m_materializer(&materializer), 65 m_map(&map), 66 m_process_address(process_address) 67 { 68 if (frame_sp) 69 { 70 m_thread_wp = frame_sp->GetThread(); 71 m_stack_id = frame_sp->GetStackID(); 72 } 73 } 74 75 Materializer *m_materializer; 76 lldb::ThreadWP m_thread_wp; 77 StackID m_stack_id; 78 IRMemoryMap *m_map; 79 lldb::addr_t m_process_address; 80 }; 81 82 typedef std::shared_ptr<Dematerializer> DematerializerSP; 83 typedef std::weak_ptr<Dematerializer> DematerializerWP; 84 85 DematerializerSP Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err); 86 87 uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err); 88 uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err); 89 uint32_t AddResultVariable (const TypeFromUser &type, bool is_lvalue, bool keep_in_memory, Error &err); 90 uint32_t AddSymbol (const Symbol &symbol_sp, Error &err); 91 uint32_t AddRegister (const RegisterInfo ®ister_info, Error &err); 92 GetStructAlignment()93 uint32_t GetStructAlignment () 94 { 95 return m_struct_alignment; 96 } 97 GetStructByteSize()98 uint32_t GetStructByteSize () 99 { 100 return m_current_offset; 101 } 102 GetResultOffset()103 uint32_t GetResultOffset () 104 { 105 if (m_result_entity) 106 return m_result_entity->GetOffset(); 107 else 108 return UINT32_MAX; 109 } 110 111 class Entity 112 { 113 public: Entity()114 Entity () : 115 m_alignment(1), 116 m_size(0), 117 m_offset(0) 118 { 119 } 120 ~Entity()121 virtual ~Entity () 122 { 123 } 124 125 virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0; 126 virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, 127 lldb::addr_t frame_top, lldb::addr_t frame_bottom, Error &err) = 0; 128 virtual void DumpToLog (IRMemoryMap &map, lldb::addr_t process_address, Log *log) = 0; 129 virtual void Wipe (IRMemoryMap &map, lldb::addr_t process_address) = 0; 130 GetAlignment()131 uint32_t GetAlignment () 132 { 133 return m_alignment; 134 } 135 GetSize()136 uint32_t GetSize () 137 { 138 return m_size; 139 } 140 GetOffset()141 uint32_t GetOffset () 142 { 143 return m_offset; 144 } 145 SetOffset(uint32_t offset)146 void SetOffset (uint32_t offset) 147 { 148 m_offset = offset; 149 } 150 protected: 151 void SetSizeAndAlignmentFromType (ClangASTType &type); 152 153 uint32_t m_alignment; 154 uint32_t m_size; 155 uint32_t m_offset; 156 }; 157 158 private: 159 uint32_t AddStructMember (Entity &entity); 160 161 typedef std::unique_ptr<Entity> EntityUP; 162 typedef std::vector<EntityUP> EntityVector; 163 164 DematerializerWP m_dematerializer_wp; 165 EntityVector m_entities; 166 Entity *m_result_entity; 167 uint32_t m_current_offset; 168 uint32_t m_struct_alignment; 169 }; 170 171 } 172 173 #endif 174