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 &register_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