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