Materializer.h revision 3b16eb9d424068446fea9cd0e0fe5e7d435f5b6e
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    private:
34        friend class Materializer;
35
36        Dematerializer (Materializer &materializer,
37                        lldb::StackFrameSP &frame_sp,
38                        IRMemoryMap &map,
39                        lldb::addr_t process_address) :
40            m_materializer(materializer),
41            m_frame_wp(frame_sp),
42            m_map(map),
43            m_process_address(process_address)
44        {
45        }
46
47        Materializer       &m_materializer;
48        lldb::StackFrameWP  m_frame_wp;
49        IRMemoryMap        &m_map;
50        lldb::addr_t        m_process_address;
51    };
52
53    Dematerializer Materialize (lldb::StackFrameSP &frame_sp, lldb::ClangExpressionVariableSP &result_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err);
54
55    uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err);
56    uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err);
57    uint32_t AddResultVariable (const ClangASTType &type, Error &err);
58    uint32_t AddSymbol (const Symbol &symbol_sp, Error &err);
59    uint32_t AddRegister (const RegisterInfo &register_info, Error &err);
60
61    uint32_t GetStructAlignment ();
62
63    class Entity
64    {
65    public:
66        Entity () :
67            m_alignment(1),
68            m_size(0),
69            m_offset(0)
70        {
71        }
72
73        virtual ~Entity ()
74        {
75        }
76
77        virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
78        virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
79
80        uint32_t GetAlignment ()
81        {
82            return m_alignment;
83        }
84
85        uint32_t GetSize ()
86        {
87            return m_size;
88        }
89
90        uint32_t GetOffset ()
91        {
92            return m_offset;
93        }
94
95        void SetOffset (uint32_t offset)
96        {
97            m_offset = offset;
98        }
99    protected:
100        void SetSizeAndAlignmentFromType (ClangASTType &type);
101
102        uint32_t    m_alignment;
103        uint32_t    m_size;
104        uint32_t    m_offset;
105    };
106
107private:
108    uint32_t AddStructMember (Entity &entity);
109
110    typedef std::unique_ptr<Entity> EntityUP;
111    typedef std::vector<EntityUP>   EntityVector;
112
113    unsigned            m_result_index;
114    Mutex               m_needs_dematerialize;
115    EntityVector        m_entities;
116    uint32_t            m_current_offset;
117    uint32_t            m_struct_alignment;
118};
119
120}
121
122#endif
123//===-- Materializer.h ------------------------------------------*- C++ -*-===//
124//
125//                     The LLVM Compiler Infrastructure
126//
127// This file is distributed under the University of Illinois Open Source
128// License. See LICENSE.TXT for details.
129//
130//===----------------------------------------------------------------------===//
131
132#ifndef lldb_Materializer_h
133#define lldb_Materializer_h
134
135#include "lldb/lldb-private-types.h"
136#include "lldb/Core/Error.h"
137#include "lldb/Expression/IRMemoryMap.h"
138#include "lldb/Host/Mutex.h"
139#include "lldb/Symbol/SymbolContext.h"
140
141#include <vector>
142
143namespace lldb_private
144{
145
146class Materializer
147{
148public:
149    Materializer ();
150
151    class Dematerializer
152    {
153    public:
154        void Dematerialize(Error &err);
155    private:
156        friend class Materializer;
157
158        Dematerializer (Materializer &materializer,
159                        lldb::StackFrameSP &frame_sp,
160                        IRMemoryMap &map,
161                        lldb::addr_t process_address) :
162            m_materializer(materializer),
163            m_frame_wp(frame_sp),
164            m_map(map),
165            m_process_address(process_address)
166        {
167        }
168
169        Materializer       &m_materializer;
170        lldb::StackFrameWP  m_frame_wp;
171        IRMemoryMap        &m_map;
172        lldb::addr_t        m_process_address;
173    };
174
175    Dematerializer Materialize (lldb::StackFrameSP &frame_sp, lldb::ClangExpressionVariableSP &result_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err);
176
177    uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err);
178    uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err);
179    uint32_t AddResultVariable (const ClangASTType &type, Error &err);
180    uint32_t AddSymbol (const Symbol &symbol_sp, Error &err);
181    uint32_t AddRegister (const RegisterInfo &register_info, Error &err);
182
183    uint32_t GetStructAlignment ();
184
185    class Entity
186    {
187    public:
188        Entity () :
189            m_alignment(1),
190            m_size(0),
191            m_offset(0)
192        {
193        }
194
195        virtual ~Entity ()
196        {
197        }
198
199        virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
200        virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
201
202        uint32_t GetAlignment ()
203        {
204            return m_alignment;
205        }
206
207        uint32_t GetSize ()
208        {
209            return m_size;
210        }
211
212        uint32_t GetOffset ()
213        {
214            return m_offset;
215        }
216
217        void SetOffset (uint32_t offset)
218        {
219            m_offset = offset;
220        }
221    protected:
222        void SetSizeAndAlignmentFromType (ClangASTType &type);
223
224        uint32_t    m_alignment;
225        uint32_t    m_size;
226        uint32_t    m_offset;
227    };
228
229private:
230    uint32_t AddStructMember (Entity &entity);
231
232    typedef std::unique_ptr<Entity> EntityUP;
233    typedef std::vector<EntityUP>   EntityVector;
234
235    unsigned            m_result_index;
236    Mutex               m_needs_dematerialize;
237    EntityVector        m_entities;
238    uint32_t            m_current_offset;
239    uint32_t            m_struct_alignment;
240};
241
242}
243
244#endif
245//===-- Materializer.h ------------------------------------------*- C++ -*-===//
246//
247//                     The LLVM Compiler Infrastructure
248//
249// This file is distributed under the University of Illinois Open Source
250// License. See LICENSE.TXT for details.
251//
252//===----------------------------------------------------------------------===//
253
254#ifndef lldb_Materializer_h
255#define lldb_Materializer_h
256
257#include "lldb/lldb-private-types.h"
258#include "lldb/Core/Error.h"
259#include "lldb/Expression/IRMemoryMap.h"
260#include "lldb/Host/Mutex.h"
261#include "lldb/Symbol/SymbolContext.h"
262
263#include <vector>
264
265namespace lldb_private
266{
267
268class Materializer
269{
270public:
271    Materializer ();
272
273    class Dematerializer
274    {
275    public:
276        void Dematerialize(Error &err);
277    private:
278        friend class Materializer;
279
280        Dematerializer (Materializer &materializer,
281                        lldb::StackFrameSP &frame_sp,
282                        IRMemoryMap &map,
283                        lldb::addr_t process_address) :
284            m_materializer(materializer),
285            m_frame_wp(frame_sp),
286            m_map(map),
287            m_process_address(process_address)
288        {
289        }
290
291        Materializer       &m_materializer;
292        lldb::StackFrameWP  m_frame_wp;
293        IRMemoryMap        &m_map;
294        lldb::addr_t        m_process_address;
295    };
296
297    Dematerializer Materialize (lldb::StackFrameSP &frame_sp, lldb::ClangExpressionVariableSP &result_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err);
298
299    uint32_t AddPersistentVariable (lldb::ClangExpressionVariableSP &persistent_variable_sp, Error &err);
300    uint32_t AddVariable (lldb::VariableSP &variable_sp, Error &err);
301    uint32_t AddResultVariable (const ClangASTType &type, Error &err);
302    uint32_t AddSymbol (const Symbol &symbol_sp, Error &err);
303    uint32_t AddRegister (const RegisterInfo &register_info, Error &err);
304
305    uint32_t GetStructAlignment ()
306    {
307        return m_struct_alignment;
308    }
309
310    uint32_t GetStructSize ()
311    {
312        return m_current_offset;
313    }
314
315    uint32_t GetNumEntities ()
316    {
317        return m_entities.size();
318    }
319
320    class Entity
321    {
322    public:
323        Entity () :
324            m_alignment(1),
325            m_size(0),
326            m_offset(0)
327        {
328        }
329
330        virtual ~Entity ()
331        {
332        }
333
334        virtual void Materialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
335        virtual void Dematerialize (lldb::StackFrameSP &frame_sp, IRMemoryMap &map, lldb::addr_t process_address, Error &err) = 0;
336
337        uint32_t GetAlignment ()
338        {
339            return m_alignment;
340        }
341
342        uint32_t GetSize ()
343        {
344            return m_size;
345        }
346
347        uint32_t GetOffset ()
348        {
349            return m_offset;
350        }
351
352        void SetOffset (uint32_t offset)
353        {
354            m_offset = offset;
355        }
356    protected:
357        void SetSizeAndAlignmentFromType (ClangASTType &type);
358
359        uint32_t    m_alignment;
360        uint32_t    m_size;
361        uint32_t    m_offset;
362    };
363
364private:
365    uint32_t AddStructMember (Entity &entity);
366
367    typedef std::unique_ptr<Entity> EntityUP;
368    typedef std::vector<EntityUP>   EntityVector;
369
370    unsigned            m_result_index;
371    Mutex               m_needs_dematerialize;
372    EntityVector        m_entities;
373    uint32_t            m_current_offset;
374    uint32_t            m_struct_alignment;
375};
376
377}
378
379#endif
380