Materializer.h revision cecfa8fca811579fdee0ad5d5354e33e18e9bdb7
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 29 class Dematerializer 30 { 31 public: 32 void Dematerialize(Error &err, 33 lldb::addr_t frame_top, 34 lldb::addr_t frame_bottom); 35 private: 36 friend class Materializer; 37 38 Dematerializer (Materializer &materializer, 39 lldb::StackFrameSP &frame_sp, 40 IRMemoryMap &map, 41 lldb::addr_t process_address) : 42 m_materializer(materializer), 43 m_frame_wp(frame_sp), 44 m_map(map), 45 m_process_address(process_address) 46 { 47 } 48 49 Materializer &m_materializer; 50 lldb::StackFrameWP m_frame_wp; 51 IRMemoryMap &m_map; 52 lldb::addr_t m_process_address; 53 }; 54 55 Dematerializer Materialize (lldb::StackFrameSP &frame_sp, lldb::ClangExpressionVariableSP &result_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err); 56 57 uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err); 58 uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err); 59 uint32_t AddResultVariable (const ClangASTType &type, bool keep_in_memory, Error &err); 60 uint32_t AddSymbol (const Symbol &symbol_sp, Error &err); 61 uint32_t AddRegister (const RegisterInfo ®ister_info, Error &err); 62 63 uint32_t GetStructAlignment () 64 { 65 return m_struct_alignment; 66 } 67 68 uint32_t GetStructByteSize () 69 { 70 return m_current_offset; 71 } 72 73 class Entity 74 { 75 public: 76 Entity () : 77 m_alignment(1), 78 m_size(0), 79 m_offset(0) 80 { 81 } 82 83 virtual ~Entity () 84 { 85 } 86 87 virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0; 88 virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, 89 lldb::addr_t frame_top, lldb::addr_t frame_bottom, Error &err) = 0; 90 91 uint32_t GetAlignment () 92 { 93 return m_alignment; 94 } 95 96 uint32_t GetSize () 97 { 98 return m_size; 99 } 100 101 uint32_t GetOffset () 102 { 103 return m_offset; 104 } 105 106 void SetOffset (uint32_t offset) 107 { 108 m_offset = offset; 109 } 110 protected: 111 void SetSizeAndAlignmentFromType (ClangASTType &type); 112 113 uint32_t m_alignment; 114 uint32_t m_size; 115 uint32_t m_offset; 116 }; 117 118private: 119 uint32_t AddStructMember (Entity &entity); 120 121 typedef std::unique_ptr<Entity> EntityUP; 122 typedef std::vector<EntityUP> EntityVector; 123 124 unsigned m_result_index; 125 Mutex m_needs_dematerialize; 126 EntityVector m_entities; 127 uint32_t m_current_offset; 128 uint32_t m_struct_alignment; 129}; 130 131} 132 133#endif 134