Materializer.h revision 0b10ef61ea60e24fe7736cd98bd5fb45efe9c816
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 &register_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