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