Materializer.h revision a6686e36cd56843e594139324884585fb47b918b
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::addr_t frame_top, 47 lldb::addr_t frame_bottom); 48 49 void Wipe (); 50 51 bool IsValid () 52 { 53 return m_materializer && m_map && (m_process_address != LLDB_INVALID_ADDRESS); 54 } 55 private: 56 friend class Materializer; 57 58 Dematerializer (Materializer &materializer, 59 lldb::StackFrameSP &frame_sp, 60 IRMemoryMap &map, 61 lldb::addr_t process_address) : 62 m_materializer(&materializer), 63 m_frame_wp(frame_sp), 64 m_map(&map), 65 m_process_address(process_address) 66 { 67 } 68 69 Materializer *m_materializer; 70 lldb::StackFrameWP m_frame_wp; 71 IRMemoryMap *m_map; 72 lldb::addr_t m_process_address; 73 }; 74 75 typedef std::shared_ptr<Dematerializer> DematerializerSP; 76 typedef std::weak_ptr<Dematerializer> DematerializerWP; 77 78 DematerializerSP Materialize (lldb::StackFrameSP &frame_sp, lldb::ClangExpressionVariableSP &result_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err); 79 80 uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err); 81 uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err); 82 uint32_t AddResultVariable (const ClangASTType &type, bool keep_in_memory, Error &err); 83 uint32_t AddSymbol (const Symbol &symbol_sp, Error &err); 84 uint32_t AddRegister (const RegisterInfo ®ister_info, Error &err); 85 86 uint32_t GetStructAlignment () 87 { 88 return m_struct_alignment; 89 } 90 91 uint32_t GetStructByteSize () 92 { 93 return m_current_offset; 94 } 95 96 class Entity 97 { 98 public: 99 Entity () : 100 m_alignment(1), 101 m_size(0), 102 m_offset(0) 103 { 104 } 105 106 virtual ~Entity () 107 { 108 } 109 110 virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0; 111 virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, 112 lldb::addr_t frame_top, lldb::addr_t frame_bottom, Error &err) = 0; 113 virtual void DumpToLog (IRMemoryMap &map, lldb::addr_t process_address, Log *log) = 0; 114 virtual void Wipe (IRMemoryMap &map, lldb::addr_t process_address) = 0; 115 116 uint32_t GetAlignment () 117 { 118 return m_alignment; 119 } 120 121 uint32_t GetSize () 122 { 123 return m_size; 124 } 125 126 uint32_t GetOffset () 127 { 128 return m_offset; 129 } 130 131 void SetOffset (uint32_t offset) 132 { 133 m_offset = offset; 134 } 135 protected: 136 void SetSizeAndAlignmentFromType (ClangASTType &type); 137 138 uint32_t m_alignment; 139 uint32_t m_size; 140 uint32_t m_offset; 141 }; 142 143private: 144 uint32_t AddStructMember (Entity &entity); 145 146 typedef std::unique_ptr<Entity> EntityUP; 147 typedef std::vector<EntityUP> EntityVector; 148 149 unsigned m_result_index; 150 DematerializerWP m_dematerializer_wp; 151 EntityVector m_entities; 152 uint32_t m_current_offset; 153 uint32_t m_struct_alignment; 154}; 155 156} 157 158#endif 159