ClangExpressionVariable.h revision 8194e42fa9e0fe204ebadb2368eb486054d66bd3
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionVariable.h -------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_ClangExpressionVariable_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ClangExpressionVariable_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <signal.h>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdint.h>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
18a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include <string>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
24a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Symbol/TaggedASTType.h"
25a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
26a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanannamespace llvm {
27a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    class Value;
28a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan}
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
318194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
328194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callananclass ClangExpressionVariableStore;
33a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass DataBufferHeap;
34a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass ExecutionContext;
35a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass Stream;
36a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass Value;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
384a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan//----------------------------------------------------------------------
39a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariable ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h"
40a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief Encapsulates one variable for the expression parser.
41a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
42a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// The expression parser uses variables in three different contexts:
43a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
44a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// First, it stores persistent variables along with the process for use
45a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// in expressions.  These persistent variables contain their own data
46a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// and are typed.
474a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan///
48a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// Second, in an interpreted expression, it stores the local variables
49a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// for the expression along with the expression.  These variables
50a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// contain their own data and are typed.
51a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
52a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// Third, in a JIT-compiled expression, it stores the variables that
53a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// the expression needs to have materialized and dematerialized at each
54a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// execution.  These do not contain their own data but are named and
55a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// typed.
56a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
57a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// This class supports all of these use cases using simple type
58a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// polymorphism, and provides necessary support methods.  Its interface
59a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// is RTTI-neutral.
604a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan//----------------------------------------------------------------------
61a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananstruct ClangExpressionVariable
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable();
64a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
65a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable(const ClangExpressionVariable &cev);
66a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
674a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
68a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// If the variable contains its own data, make a Value point at it
69a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
70a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] value
71a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The value to point at the data.
72a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
73a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @return
74a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     True on success; false otherwise (in particular, if this variable
75a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     does not contain its own data).
764a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
77a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    bool
78a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    PointValueAtData(Value &value);
794a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan
804a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
81a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// The following values should stay valid for the life of the variable
824a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
83a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    std::string             m_name;         ///< The name of the variable
84a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    TypeFromUser            m_user_type;    ///< The type of the variable according to some LLDB context; NULL if the type hasn't yet been migrated to one
85a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
86a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
878194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    /// The following values indicate where the variable originally came from
888194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    //----------------------------------------------------------------------
898194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    ClangExpressionVariableStore   *m_store;    ///< The store containing the variable
908194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    uint64_t                        m_index;    ///< The index of the variable in the store
918194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
928194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    //----------------------------------------------------------------------
93a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// The following values should not live beyond parsing
94a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
95a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    struct ParserVars {
96a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        TypeFromParser          m_parser_type;  ///< The type of the variable according to the parser
97a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        const clang::NamedDecl *m_named_decl;   ///< The Decl corresponding to this variable
98a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        llvm::Value            *m_llvm_value;   ///< The IR value corresponding to this variable; usually a GlobalValue
998c12720c108cd5e7ed792596749218d8400f647eSean Callanan        lldb_private::Value    *m_lldb_value;   ///< The value found in LLDB for this variable
100a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    };
101a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    std::auto_ptr<ParserVars> m_parser_vars;
102a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
103a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
104a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Make this variable usable by the parser by allocating space for
105a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// parser-specific variables
106a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
107a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void EnableParserVars()
108a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
109a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        if (!m_parser_vars.get())
110a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan            m_parser_vars.reset(new struct ParserVars);
111a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
112a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
113a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
114a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Deallocate parser-specific variables
115a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
116a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void DisableParserVars()
117a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
118a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        m_parser_vars.reset();
119a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
120a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
121a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
122a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// The following values are valid if the variable is used by JIT code
123a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
124a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    struct JITVars {
125a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        off_t   m_alignment;    ///< The required alignment of the variable, in bytes
126a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        size_t  m_size;         ///< The space required for the variable, in bytes
127a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        off_t   m_offset;       ///< The offset of the variable in the struct, in bytes
128a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    };
129a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    std::auto_ptr<JITVars> m_jit_vars;
130a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
131a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
132a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Make this variable usable for materializing for the JIT by allocating
133a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// space for JIT-specific variables
134a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
135a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void EnableJITVars()
136a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
137a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        if (!m_jit_vars.get())
138a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan            m_jit_vars.reset(new struct JITVars);
139a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
140a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
141a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
142a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Deallocate JIT-specific variables
143a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
144a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void DisableJITVars()
145a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
146a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        m_jit_vars.reset();
147a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
148a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
149a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
150a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// The following values are valid if the value contains its own data
151a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
152a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    struct DataVars {
153a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        lldb_private::DataBufferHeap   *m_data; ///< The heap area allocated to contain this variable's data.  Responsibility for deleting this falls to whoever uses the variable last
154a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    };
155a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    std::auto_ptr<DataVars> m_data_vars;
156a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
157a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
158a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Make this variable usable for storing its data internally by
159a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// allocating data-specific variables
160a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
161a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void EnableDataVars()
162a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
163a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        if (!m_jit_vars.get())
164a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan            m_data_vars.reset(new struct DataVars);
165a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
166a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
167a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
168a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Deallocate data-specific variables
169a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
170a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void DisableDataVars();
171a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
172a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
173a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Return the variable's size in bytes
174a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
175a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    size_t Size ()
176a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
177a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return (m_user_type.GetClangTypeBitWidth () + 7) / 8;
178a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
179a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1804a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
181a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Pretty-print the variable, assuming it contains its own data
1824a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
183a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] output_stream
184a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The stream to pretty-print on.
1854a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
186a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] exe_ctx
187a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The execution context to use when resolving the contents of the
188a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     variable.
1894a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
190a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] format
191a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The format to print the variable in
192a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
193a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] show_types
194a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     If true, print the type of the variable
195a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
196a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] show_summary
197a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     If true, print a summary of the variable's type
198a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
199a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] verbose
200a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     If true, be verbose in printing the value of the variable
2014a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
2024a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    /// @return
203a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     An Error describing the result of the operation.  If Error::Success()
204a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     returns true, the pretty printing completed successfully.
205a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
206a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    Error Print(Stream &output_stream,
207a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                ExecutionContext &exe_ctx,
208a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                lldb::Format format,
209a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                bool show_types,
210a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                bool show_summary,
211a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                bool verbose);
212a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan};
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
214a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
215a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h"
216a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief Manages variables that the expression parser uses.
217a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
218a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// The expression parser uses variable lists in various contexts, as
219a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// discuessed at ClangExpressionVariable.  This abstract class contains
220a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// the basic functions for managing a list of variables.  Its subclasses
221a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// store pointers to variables or variables, depending on whether they
222a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// are backing stores or merely transient repositories.
223a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
224a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass ClangExpressionVariableListBase
225a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{
226a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic:
227a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
228a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Return the number of variables in the list
229a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
230a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    virtual uint64_t Size() = 0;
231a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
2324a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
233a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Return the variable at the given index in the list
234a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
235a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    virtual ClangExpressionVariable &VariableAtIndex(uint64_t index) = 0;
236a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
237a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
238a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Add a new variable and return its index
239a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
240a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    virtual uint64_t AddVariable(ClangExpressionVariable& var) = 0;
241a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
242a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
243a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Finds a variable by name in the list.
2444a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
245a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] name
246a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The name of the requested variable.
2474a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
2484a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    /// @return
249a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The variable requested, or NULL if that variable is not in the list.
250a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
251a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable *GetVariable (const char *name)
252a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
253a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        for (uint64_t index = 0, size = Size(); index < size; ++index)
254a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        {
255a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan            ClangExpressionVariable &candidate (VariableAtIndex(index));
256a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan            if (!candidate.m_name.compare(name))
257a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                return &candidate;
258a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        }
259a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return NULL;
260a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
2618c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2628c12720c108cd5e7ed792596749218d8400f647eSean Callanan    //----------------------------------------------------------------------
2638c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// Finds a variable by NamedDecl in the list.
2648c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
2658c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] name
2668c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The name of the requested variable.
2678c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
2688c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @return
2698c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The variable requested, or NULL if that variable is not in the list.
2708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    //----------------------------------------------------------------------
2718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *GetVariable (const clang::NamedDecl *decl)
2728c12720c108cd5e7ed792596749218d8400f647eSean Callanan    {
2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan        for (uint64_t index = 0, size = Size(); index < size; ++index)
2748c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
2758c12720c108cd5e7ed792596749218d8400f647eSean Callanan            ClangExpressionVariable &candidate (VariableAtIndex(index));
2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan            if (candidate.m_parser_vars.get() &&
2778c12720c108cd5e7ed792596749218d8400f647eSean Callanan                candidate.m_parser_vars->m_named_decl == decl)
2788c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return &candidate;
2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
2808c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return NULL;
2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    }
282a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan};
2838194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
284a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
285a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h"
286a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief A list of variable references.
287a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
2888194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan/// This class stores variables internally, acting as the permanent store.
289a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
2908194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callananclass ClangExpressionVariableStore : public ClangExpressionVariableListBase
291a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{
292a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic:
2934a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
294a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Implementation of methods in ClangExpressionVariableListBase
295a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
296a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    uint64_t Size()
297a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
298a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return m_variables.size();
299a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
300a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
301a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable &VariableAtIndex(uint64_t index)
302a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
3038194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        return m_variables[index];
304a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
305a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
306a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    uint64_t AddVariable(ClangExpressionVariable &var)
307a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
3088194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        m_variables.push_back(var);
309a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return m_variables.size() - 1;
310a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
3118194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
3128194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    //----------------------------------------------------------------------
3138194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    /// Create a new variable in the list and return its index
3148194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    //----------------------------------------------------------------------
3158194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    uint64_t CreateVariable()
3168194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    {
3178194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        uint64_t index = m_variables.size();
3188194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
3198194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        m_variables.push_back(ClangExpressionVariable());
3208194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        m_variables[index].m_store = this;
3218194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        m_variables[index].m_index = index;
3228194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
3238194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        return index;
3248194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    }
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
3268194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    std::vector <ClangExpressionVariable> m_variables;
327a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan};
328a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
329a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
330a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h"
331a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief A list of variable references.
332a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
3338194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan/// This class stores references to variables stored elsewhere.
334a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
3358194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callananclass ClangExpressionVariableList : public ClangExpressionVariableListBase
336a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{
337a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic:
3384a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
339a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Implementation of methods in ClangExpressionVariableListBase
340a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
341a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    uint64_t Size()
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3438194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        return m_references.size();
344a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
345a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
346a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable &VariableAtIndex(uint64_t index)
347a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
3488194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        return m_references[index].first->VariableAtIndex(m_references[index].second);
349a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
351a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    uint64_t AddVariable(ClangExpressionVariable &var)
352a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
3538194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        m_references.push_back(ClangExpressionVariableRef(var.m_store, var.m_index));
3548194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan        return m_references.size() - 1;
355a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
356a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananprivate:
3578194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    typedef std::pair <ClangExpressionVariableStore *, uint64_t>
3588194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    ClangExpressionVariableRef;
3598194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
3608194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    std::vector <ClangExpressionVariableRef> m_references;
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionVariable_h_
366