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>
16f6d8b67a2501eeffecbd016cb6192474204d133fGreg Clayton#include <string.h>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan#include <map>
20a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include <string>
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
25b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-public.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
278de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Core/ConstString.h"
2852f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "lldb/Core/Value.h"
29a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Symbol/TaggedASTType.h"
30a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
31a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanannamespace llvm {
32a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    class Value;
33a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan}
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
368194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
37427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclass ClangExpressionVariableList;
38427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclass ValueObjectConstResult;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan//----------------------------------------------------------------------
41a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariable ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h"
42a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief Encapsulates one variable for the expression parser.
43a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
44a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// The expression parser uses variables in three different contexts:
45a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
46a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// First, it stores persistent variables along with the process for use
47a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// in expressions.  These persistent variables contain their own data
48a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// and are typed.
494a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan///
50a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// Second, in an interpreted expression, it stores the local variables
51a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// for the expression along with the expression.  These variables
52a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// contain their own data and are typed.
53a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
54a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// Third, in a JIT-compiled expression, it stores the variables that
55a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// the expression needs to have materialized and dematerialized at each
56a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// execution.  These do not contain their own data but are named and
57a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// typed.
58a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
59a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// This class supports all of these use cases using simple type
60a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// polymorphism, and provides necessary support methods.  Its interface
61a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// is RTTI-neutral.
624a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan//----------------------------------------------------------------------
63427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclass ClangExpressionVariable
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
65427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonpublic:
66fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariable(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size);
67427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
68427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariable(const lldb::ValueObjectSP &valobj_sp);
69427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
704a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
71324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    /// If the variable contains its own data, make a Value point at it.
72324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    /// If \a exe_ctx in not NULL, the value will be resolved in with
73324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    /// that execution context.
74a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
75a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] value
76a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The value to point at the data.
77a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///
78324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    /// @param[in] exe_ctx
79324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    ///     The execution context to use to resolve \a value.
80324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    ///
81a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @return
82a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     True on success; false otherwise (in particular, if this variable
83a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     does not contain its own data).
844a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
85a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    bool
86324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    PointValueAtData(Value &value, ExecutionContext *exe_ctx);
874a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan
8866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    lldb::ValueObjectSP
89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetValueObject();
9066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
914a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    //----------------------------------------------------------------------
92a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// The following values should not live beyond parsing
93a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
94bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    class ParserVars
95bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
96bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    public:
9766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
9866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        ParserVars() :
9966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            m_parser_type(),
10066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            m_named_decl (NULL),
10166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            m_llvm_value (NULL),
10252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            m_lldb_value (),
1039d4e86e20fd4b6a0bb4a3d003680ef2c4a842021Sean Callanan            m_lldb_var   (),
1049d4e86e20fd4b6a0bb4a3d003680ef2c4a842021Sean Callanan            m_lldb_sym   (NULL)
10566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
10666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
10766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
108a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        TypeFromParser          m_parser_type;  ///< The type of the variable according to the parser
109a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        const clang::NamedDecl *m_named_decl;   ///< The Decl corresponding to this variable
110a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        llvm::Value            *m_llvm_value;   ///< The IR value corresponding to this variable; usually a GlobalValue
11152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        lldb_private::Value     m_lldb_value;   ///< The value found in LLDB for this variable
112696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        lldb::VariableSP        m_lldb_var;     ///< The original variable for this variable
11301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        const lldb_private::Symbol *m_lldb_sym; ///< The original symbol for this variable, if it was a symbol
114a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    };
11531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
11631903318116cbd66801cd2a526cc5e5873d20e4cSean Callananprivate:
11731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    typedef std::map <uint64_t, ParserVars> ParserVarMap;
11831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ParserVarMap m_parser_vars;
11931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
12031903318116cbd66801cd2a526cc5e5873d20e4cSean Callananpublic:
121a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
122a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Make this variable usable by the parser by allocating space for
123a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// parser-specific variables
124a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
12631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    EnableParserVars(uint64_t parser_id)
127a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
128cec32bbcad3e99d7f797072e5e160453e29890acMatt Kopec        m_parser_vars.insert(std::make_pair(parser_id, ParserVars()));
129a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
130a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
131a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
132a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Deallocate parser-specific variables
133a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
13531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    DisableParserVars(uint64_t parser_id)
13631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    {
13731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        m_parser_vars.erase(parser_id);
13831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    }
13931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
14031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    //----------------------------------------------------------------------
14131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    /// Access parser-specific variables
14231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    //----------------------------------------------------------------------
14331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ParserVars *
14431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    GetParserVars(uint64_t parser_id)
145a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
14631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ParserVarMap::iterator i = m_parser_vars.find(parser_id);
14731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
14831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (i == m_parser_vars.end())
14931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            return NULL;
15031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        else
15131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            return &i->second;
152a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
153a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
154a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
155a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// The following values are valid if the variable is used by JIT code
156a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
157a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    struct JITVars {
15866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        JITVars () :
15966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            m_alignment (0),
16066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            m_size (0),
16166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            m_offset (0)
16266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
16366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
16466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
165a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        off_t   m_alignment;    ///< The required alignment of the variable, in bytes
166a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        size_t  m_size;         ///< The space required for the variable, in bytes
167a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        off_t   m_offset;       ///< The offset of the variable in the struct, in bytes
168a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    };
16931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
17031903318116cbd66801cd2a526cc5e5873d20e4cSean Callananprivate:
17131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    typedef std::map <uint64_t, JITVars> JITVarMap;
17231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    JITVarMap m_jit_vars;
17331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
17431903318116cbd66801cd2a526cc5e5873d20e4cSean Callananpublic:
175a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
176a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Make this variable usable for materializing for the JIT by allocating
177a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// space for JIT-specific variables
178a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
18031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    EnableJITVars(uint64_t parser_id)
181a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
182cec32bbcad3e99d7f797072e5e160453e29890acMatt Kopec        m_jit_vars.insert(std::make_pair(parser_id, JITVars()));
183a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
184a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
185a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
186a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Deallocate JIT-specific variables
187a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
18931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    DisableJITVars(uint64_t parser_id)
190a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
19131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        m_jit_vars.erase(parser_id);
19231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    }
19331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
19431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    JITVars *GetJITVars(uint64_t parser_id)
19531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    {
19631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        JITVarMap::iterator i = m_jit_vars.find(parser_id);
19731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
19831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (i == m_jit_vars.end())
19931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            return NULL;
20031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        else
20131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            return &i->second;
202a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
203427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
204a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    /// Return the variable's size in bytes
206a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    size_t
208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetByteSize ();
20966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const ConstString &
211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetName();
212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
213b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    RegisterInfo *
214427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetRegisterInfo();
215a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
216427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
217b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    SetRegisterInfo (const RegisterInfo *reg_info);
218427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
21952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
220427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetClangType ();
221427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
222427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
22352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetClangType (const ClangASTType &clang_type);
224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
225427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser
226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetTypeFromUser ();
227427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *
229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetValueBytes ();
230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    SetName (const ConstString &name);
233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueUpdated ();
236c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen
237c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    // this function is used to copy the address-of m_live_sp into m_frozen_sp
238c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    // this is necessary because the results of certain cast and pointer-arithmetic
239c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    // operations (such as those described in bugzilla issues 11588 and 11618) generate
240c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    // frozen objcts that do not have a valid address-of, which can be troublesome when
241c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    // using synthetic children providers. transferring the address-of the live object
242c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    // solves these issues and provides the expected user-level behavior
243c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    void
244c61349681fa2923bd30ad16afce450a0da6108cfJohnny Chen    TransferAddress (bool force = false);
245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
246102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    typedef std::shared_ptr<ValueObjectConstResult> ValueObjectConstResultSP;
247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
248a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    /// Members
250a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
2516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    enum Flags
2526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
2536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        EVNone                  = 0,
2546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        EVIsLLDBAllocated       = 1 << 0,   ///< This variable is resident in a location specifically allocated for it by LLDB in the target process
2556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        EVIsProgramReference    = 1 << 1,   ///< This variable is a reference to a (possibly invalid) area managed by the target program
2566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        EVNeedsAllocation       = 1 << 2,   ///< Space for this variable has yet to be allocated in the target process
2576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        EVIsFreezeDried         = 1 << 3,   ///< This variable's authoritative version is in m_frozen_sp (for example, for statically-computed results)
2586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        EVNeedsFreezeDry        = 1 << 4,   ///< Copy from m_live_sp to m_frozen_sp during dematerialization
259fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        EVKeepInTarget          = 1 << 5,   ///< Keep the allocation after the expression is complete rather than freeze drying its contents and freeing it
2606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        EVTypeIsReference       = 1 << 6,   ///< The original type of this variable is a reference, so materialize the value rather than the location
26152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        EVUnknownType           = 1 << 7,   ///< This is a symbol of unknown type, and the type must be resolved after parsing is complete
26252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        EVBareRegister          = 1 << 8    ///< This variable is a direct reference to $pc or some other entity.
2636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    };
2646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
26552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    typedef uint16_t FlagType;
26652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
26752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    FlagType m_flags; // takes elements of Flags
2686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::ValueObjectSP m_frozen_sp;
2706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::ValueObjectSP m_live_sp;
27131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
272427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DISALLOW_COPY_AND_ASSIGN (ClangExpressionVariable);
273a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan};
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
276a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h"
277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton/// @brief A list of variable references.
278a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan///
279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton/// This class stores variables internally, acting as the permanent store.
280a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//----------------------------------------------------------------------
281427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclass ClangExpressionVariableList
282a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{
283a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic:
284a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    /// Implementation of methods in ClangExpressionVariableListBase
286a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
287a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    size_t
288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetSize()
289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return m_variables.size();
291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
292a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
293a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    lldb::ClangExpressionVariableSP
294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetVariableAtIndex(size_t index)
295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        lldb::ClangExpressionVariableSP var_sp;
297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (index < m_variables.size())
298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp = m_variables[index];
299427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
300427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
301a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
302a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    size_t
303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddVariable (const lldb::ClangExpressionVariableSP &var_sp)
304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_variables.push_back(var_sp);
306427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return m_variables.size() - 1;
307427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
309a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    bool
310a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    ContainsVariable (const lldb::ClangExpressionVariableSP &var_sp)
311a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    {
312a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        const size_t size = m_variables.size();
313a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        for (size_t index = 0; index < size; ++index)
314a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        {
315a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (m_variables[index].get() == var_sp.get())
316a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                return true;
317a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        }
318a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        return false;
319a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    }
320a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
321a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
322a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// Finds a variable by name in the list.
3234a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
324a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    /// @param[in] name
325a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The name of the requested variable.
3264a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    ///
3274a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan    /// @return
328a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     The variable requested, or NULL if that variable is not in the list.
329a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    //----------------------------------------------------------------------
330427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP
331427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetVariable (const ConstString &name)
332a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
333427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        lldb::ClangExpressionVariableSP var_sp;
334427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t index = 0, size = GetSize(); index < size; ++index)
335a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        {
336427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp = GetVariableAtIndex(index);
337427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp->GetName() == name)
338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                return var_sp;
339a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        }
340427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp.reset();
341427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
343427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
344427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP
345427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetVariable (const char *name)
346427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
347427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        lldb::ClangExpressionVariableSP var_sp;
348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (name && name[0])
349427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            for (size_t index = 0, size = GetSize(); index < size; ++index)
351427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp = GetVariableAtIndex(index);
353427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                const char *var_name_cstr = var_sp->GetName().GetCString();
354434b7dde31ae8b59f20add4dd27e051dd71fbe2cSean Callanan                if (!var_name_cstr || !name)
355434b7dde31ae8b59f20add4dd27e051dd71fbe2cSean Callanan                    continue;
356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (::strcmp (var_name_cstr, name) == 0)
357427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    return var_sp;
358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp.reset();
360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
361427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
362a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
3638c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3648c12720c108cd5e7ed792596749218d8400f647eSean Callanan    //----------------------------------------------------------------------
3658c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// Finds a variable by NamedDecl in the list.
3668c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
3678c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] name
3688c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The name of the requested variable.
3698c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
3708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @return
3718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The variable requested, or NULL if that variable is not in the list.
3728c12720c108cd5e7ed792596749218d8400f647eSean Callanan    //----------------------------------------------------------------------
373427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP
37431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    GetVariable (const clang::NamedDecl *decl, uint64_t parser_id)
3758c12720c108cd5e7ed792596749218d8400f647eSean Callanan    {
376427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        lldb::ClangExpressionVariableSP var_sp;
377427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t index = 0, size = GetSize(); index < size; ++index)
3788c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
379427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp = GetVariableAtIndex(index);
38031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
38131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(parser_id);
38231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
38331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            if (parser_vars && parser_vars->m_named_decl == decl)
384427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                return var_sp;
3858c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
386427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp.reset();
387427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
388a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3908194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    //----------------------------------------------------------------------
3918194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    /// Create a new variable in the list and return its index
3928194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    //----------------------------------------------------------------------
393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP
394fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    CreateVariable (ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size)
3958194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    {
396fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        lldb::ClangExpressionVariableSP var_sp(new ClangExpressionVariable(exe_scope, byte_order, addr_byte_size));
397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_variables.push_back(var_sp);
398427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
3998194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan    }
400427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
401427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP
402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    CreateVariable(const lldb::ValueObjectSP &valobj_sp)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        lldb::ClangExpressionVariableSP var_sp(new ClangExpressionVariable(valobj_sp));
405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_variables.push_back(var_sp);
406427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
407a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
408427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP
410fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    CreateVariable (ExecutionContextScope *exe_scope,
411fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    const ConstString &name,
412427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    const TypeFromUser& user_type,
413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    lldb::ByteOrder byte_order,
414427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    uint32_t addr_byte_size)
415a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    {
416fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        lldb::ClangExpressionVariableSP var_sp(new ClangExpressionVariable(exe_scope, byte_order, addr_byte_size));
417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp->SetName (name);
41852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        var_sp->SetClangType (user_type);
419427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_variables.push_back(var_sp);
420427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        return var_sp;
421a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    }
4228194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan
423153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton    void
4248f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    RemoveVariable (lldb::ClangExpressionVariableSP var_sp)
4258f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    {
4268f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        for (std::vector<lldb::ClangExpressionVariableSP>::iterator vi = m_variables.begin(), ve = m_variables.end();
4278f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan             vi != ve;
4288f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan             ++vi)
4298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        {
4308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan            if (vi->get() == var_sp.get())
4318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan            {
4328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                m_variables.erase(vi);
4338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                return;
4348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan            }
4358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        }
4368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    }
4378f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
4388f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    void
439153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton    Clear()
440153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton    {
441153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton        m_variables.clear();
442153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton    }
443153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton
444427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonprivate:
445427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    std::vector <lldb::ClangExpressionVariableSP> m_variables;
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionVariable_h_
452