ClangExpressionDeclMap.h revision 047923c7bc90275f29c2e179d2385df26b8d81a1
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.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_ClangExpressionDeclMap_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ClangExpressionDeclMap_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <signal.h>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdint.h>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
226df0840c87be29724055716db951aa6d494ddabcSean Callanan#include "llvm/ADT/DenseMap.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h"
25a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Expression/ClangExpressionVariable.h"
26841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan#include "lldb/Symbol/TaggedASTType.h"
278de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Symbol/SymbolContext.h"
288de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Target/ExecutionContext.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanannamespace llvm {
3193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    class Type;
328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    class Value;
338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass ClangExpressionVariables;
38e562a073bba53fa46161feb51d1b1e36f9af9666Sean Callananclass ClangPersistentVariables;
39810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callananclass Error;
408f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananclass Function;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass NameSearchContext;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Variable;
43a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
44a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan//----------------------------------------------------------------------
45a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// @class ClangExpressionDeclMap ClangExpressionDeclMap.h "lldb/Expression/ClangExpressionDeclMap.h"
46a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// @brief Manages named entities that are defined in LLDB's debug information.
47a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
48a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// The Clang parser uses the ClangASTSource as an interface to request named
49a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// entities from outside an expression.  The ClangASTSource reports back, listing
50a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// all possible objects corresponding to a particular name.  But it in turn
51a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// relies on ClangExpressionDeclMap, which performs several important functions.
52a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
53a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// First, it records what variables and functions were looked up and what Decls
54a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// were returned for them.
55a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
56a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Second, it constructs a struct on behalf of IRForTarget, recording which
57a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// variables should be placed where and relaying this information back so that
58a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// IRForTarget can generate context-independent code.
59a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
60a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Third, it "materializes" this struct on behalf of the expression command,
61a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// finding the current values of each variable and placing them into the
62a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// struct so that it can be passed to the JITted version of the IR.
63a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
64a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Fourth and finally, it "dematerializes" the struct after the JITted code has
65a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// has executed, placing the new values back where it found the old ones.
66a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan//----------------------------------------------------------------------
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionDeclMap
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
70a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
71a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Constructor
72a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
73a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Initializes class variabes.
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangExpressionDeclMap();
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Destructor
79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
80aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ~ClangExpressionDeclMap();
81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
83aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Enable the state needed for parsing and IR transformation.
84a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
85a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
86a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use when finding types for variables.
87a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     Also used to find a "scratch" AST context to store result types.
88a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
89aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void WillParse(ExecutionContext &exe_ctx);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
92aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Disable the state needed for parsing and IR transformation.
93a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
94aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void DidParse();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
97a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get a new result variable name of the form
98a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     $n, where n is a natural number starting with 0.
99a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
100a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
101a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The std::string to place the name into.
102a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &
1048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    GetPersistentResultName ();
105a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1066916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    clang::NamespaceDecl *
1076916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    AddNamespace (NameSearchContext &context,
1086916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                  const ClangNamespaceDecl &namespace_decl);
1096916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
110a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
111a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the list of persistent
112a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     variables for the process.
113a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1148c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] decl
1158c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The Clang declaration for the persistent variable, used for
1168c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     lookup during parsing.
1178c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
118a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
119a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the persistent variable, usually $something.
120a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
121a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
122a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the variable, in the Clang parser's context.
123a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
124a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
125a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
126a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1278c12720c108cd5e7ed792596749218d8400f647eSean Callanan    bool AddPersistentVariable (const clang::NamedDecl *decl,
1288de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                const ConstString &name,
1298c12720c108cd5e7ed792596749218d8400f647eSean Callanan                                TypeFromParser type);
130a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
131a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
132a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the struct that needs to
133a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized each time the expression runs.
134a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
135a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
136a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Clang declaration for the variable.
137a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
13845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[in] name
13945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the variable.
14045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
1418c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] value
1428c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The LLVM IR value for this variable.
143a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
144a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] size
145a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the variable in bytes.
146a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
147a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] alignment
148a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required alignment of the variable in bytes.
149a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
150a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
151a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
152a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1538c12720c108cd5e7ed792596749218d8400f647eSean Callanan    bool AddValueToStruct (const clang::NamedDecl *decl,
1548de27c761a22187ef63fb60000894be163e7285fGreg Clayton                           const ConstString &name,
1558c12720c108cd5e7ed792596749218d8400f647eSean Callanan                           llvm::Value *value,
1568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           size_t size,
1578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           off_t alignment);
158a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
159a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
160a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Finalize the struct, laying out the position
161a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of each object in it.
162a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
163a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
164a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
165a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool DoStructLayout ();
167a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
168a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
169a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get general information about the laid-out
170a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct after DoStructLayout() has been called.
171a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
172a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] num_elements
173a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The number of elements in the struct.
174a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
175a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] size
176a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the struct, in bytes.
177a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
178a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] alignment
179a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The alignment of the struct, in bytes.
180a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
181a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
182a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
183a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool GetStructInfo (uint32_t &num_elements,
1858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                        size_t &size,
1868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                        off_t &alignment);
187a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
188a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
189a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get specific information about one field
190a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of the laid-out struct after DoStructLayout() has been called.
191a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
192a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] decl
193a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the field, as generated by ClangASTSource
194a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.  In the case of the result
1958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     value, this will have the name $__lldb_result even if the
196a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     result value ends up having the name $1.  This is an
197a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     implementation detail of IRForTarget.
198a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
199a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
200a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The IR value for the field (usually a GlobalVariable).  In
201a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     the case of the result value, this will have the correct
202a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     name ($1, for instance).  This is an implementation detail
203a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of IRForTarget.
204a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
205a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] offset
206a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The offset of the field from the beginning of the struct.
207a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     As long as the struct is aligned according to its required
208a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     alignment, this offset will align the field correctly.
209a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
21045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[out] name
21145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the field as used in materialization.
21245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
213a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] index
214a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The index of the field about which information is requested.
215a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
216a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
217a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
218a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
2198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool GetStructElement (const clang::NamedDecl *&decl,
2208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           llvm::Value *&value,
2218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           off_t &offset,
2228de27c761a22187ef63fb60000894be163e7285fGreg Clayton                           ConstString &name,
2238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           uint32_t index);
2248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
225a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
226a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get information about a function given its
227a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Decl.
228a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
229a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
230a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the Function, as generated by ClangASTSource
231a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.
232a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
233a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
234a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     A pointer to the address where a Value for the function's address
235a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     can be stored.  IRForTarget typically places a ConstantExpr here.
236a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
237a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
238a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
239a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
240a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
241a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
242a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
24302fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan    bool GetFunctionInfo (const clang::NamedDecl *decl,
24402fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan                          llvm::Value**& value,
24502fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan                          uint64_t &ptr);
246a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
247a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
248a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get the address of a function given nothing
249a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// but its name.  Some functions are needed but didn't get Decls made
250a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// during parsing -- specifically, sel_registerName is never called
251a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// in the generated IR but we need to call it nonetheless.
252a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
253a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
254a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the function.
255a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
256a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
257a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
258a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
259a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
260a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the address could be retrieved; false otherwise.
261a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
2628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool GetFunctionAddress (const ConstString &name,
263f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan                             uint64_t &ptr);
264f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
265a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
266a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Materialize the entire struct
267a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// at a given address, which should be aligned as specified by
268a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// GetStructInfo().
269a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
270a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
271a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context at which to dump the struct.
272a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
273a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] struct_address
274a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which the struct should be written.
275a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
276a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
277a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
278a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     materializing the struct.
279a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
280a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
281a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
282a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
283aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    bool Materialize(ExecutionContext &exe_ctx,
284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                     lldb::addr_t &struct_address,
285f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                     Error &error);
286f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
287a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
2883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// [Used by CommandObjectExpression] Get the "this" pointer
2893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// from a given execution context.
2903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
2913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[out] object_ptr
2923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The this pointer.
2933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
2943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    /// @param[in] object_name
2953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///     The name of the object pointer -- "this," "self," or similar
2963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///     depending on language
2973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///
2983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] exe_ctx
2993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The execution context at which to dump the struct.
3003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
3013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] error
3023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     An Error to populate with any messages related to
3033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     finding the "this" pointer.
3043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
305047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    /// @param[in] suppress_type_check
306047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    ///     True if the type is not needed.
307047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    ///
3083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @return
3093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     True on success; false otherwise.
3103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
3113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    bool GetObjectPointer(lldb::addr_t &object_ptr,
3123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                          ConstString &object_name,
313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                          ExecutionContext &exe_ctx,
314047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan                          Error &error,
315047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan                          bool suppress_type_check = false);
3163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
318a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Pretty-print a materialized
319a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct, which must have been materialized by Materialize(),
320a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// byte for byte on a given stream.
321a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
322a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
323a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
324a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
325a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] s
326a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The stream on which to write the pretty-printed output.
327a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
328a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
329a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
330a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     pretty-printing the struct.
331a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
332a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
333a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
334a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
335aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    bool DumpMaterializedStruct(ExecutionContext &exe_ctx,
33632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan                                Stream &s,
33732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan                                Error &error);
33832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
339a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
340a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Deaterialize the entire struct.
341a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
342a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
343a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
344a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
345a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
346a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     A ClangExpressionVariable containing the result of the
347a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     expression, for potential re-use.
348a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
349a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
350a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
351a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     dematerializing the struct.
352a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
353a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
354a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
355a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
356aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    bool Dematerialize(ExecutionContext &exe_ctx,
357a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                       ClangExpressionVariable *&result,
358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                       Error &error);
359810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
360a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
361a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
362a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// using a NameSearchContext to make Decls for them.
363a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
364a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
365a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
366a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
367a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
368a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
369a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
370a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
371a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     it can't access DeclarationName.
372a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
373a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
374a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
375a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void GetDecls (NameSearchContext &context,
3778de27c761a22187ef63fb60000894be163e7285fGreg Clayton                   const ConstString &name);
378aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
379aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
380aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// [Used by ClangASTSource] Report whether a $__lldb variable has
381aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// been searched for yet.  This is the trigger for beginning to
382aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// actually look for externally-defined names.  (Names that come
383aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// before this are typically the names of built-ins that don't need
384aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// to be looked up.)
385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ///
386aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// @return
387aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ///     True if a $__lldb variable has been found.
388aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
3898de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool
3908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    GetLookupsEnabled ()
3918de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
392aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        assert(m_parser_vars.get());
393aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        return m_parser_vars->m_enable_lookups;
3948de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
3958de27c761a22187ef63fb60000894be163e7285fGreg Clayton
396aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
397aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// [Used by ClangASTSource] Indicate that a $__lldb variable has
398aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// been found.
399aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
4008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    void
401aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    SetLookupsEnabled ()
4028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
403aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        assert(m_parser_vars.get());
404aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_enable_lookups = true;
4058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
4068de27c761a22187ef63fb60000894be163e7285fGreg Clayton
407a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callananprivate:
408aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangExpressionVariableStore    m_found_entities;           ///< All entities that were looked up for the parser.
409aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangExpressionVariableList     m_struct_members;           ///< All entities that need to be placed in the struct.
410aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
411aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
412aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values should not live beyond parsing
413aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
414aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct ParserVars {
415aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ParserVars() :
416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_exe_ctx(NULL),
417aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_sym_ctx(),
418aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_persistent_vars(NULL),
419aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_enable_lookups(false),
420aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_ignore_lookups(false)
421aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
422aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
424aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ExecutionContext           *m_exe_ctx;          ///< The execution context to use when parsing.
425aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        SymbolContext               m_sym_ctx;          ///< The symbol context to use in finding variables and types.
426aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ClangPersistentVariables   *m_persistent_vars;  ///< The persistent variables for the process.
427aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_enable_lookups;   ///< Set to true during parsing if we have found the first "$__lldb" name.
428aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_ignore_lookups;   ///< True during an import when we should be ignoring type lookups.
429aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
430aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
431aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<ParserVars> m_parser_vars;
432aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
434aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate parser-specific variables
435aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
436aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void EnableParserVars()
437aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
438aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_parser_vars.get())
439aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_parser_vars.reset(new struct ParserVars);
440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
441aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
442aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
443aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate parser-specific variables
444aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
445aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void DisableParserVars()
446aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
447aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars.reset();
448aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
449aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values contain layout information for the materialized
452aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// struct, but are not specific to a single materialization
453aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
454aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct StructVars {
455aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        StructVars() :
456aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_alignment(0),
457aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_size(0),
458aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_laid_out(false),
459aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_result_name(),
460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_object_pointer_type(NULL, NULL)
461aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
462aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
463aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
464aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        off_t                       m_struct_alignment;         ///< The alignment of the struct in bytes.
465aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        size_t                      m_struct_size;              ///< The size of the struct in bytes.
466aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_struct_laid_out;          ///< True if the struct has been laid out and the layout is valid (that is, no new fields have been added since).
467aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ConstString                 m_result_name;              ///< The name of the result variable ($1, for example)
468aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TypeFromUser                m_object_pointer_type;      ///< The type of the "this" variable, if one exists
469aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<StructVars> m_struct_vars;
472aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
473aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate struct variables
475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void EnableStructVars()
477aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_struct_vars.get())
479aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars.reset(new struct StructVars);
480aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
481aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
482aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
483aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate struct variables
484aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
485aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void DisableStructVars()
486aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
487aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_struct_vars.reset();
488aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
489aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
490aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
491aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values refer to a specific materialization of the
492aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// structure in a process
493aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct MaterialVars {
495aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        MaterialVars() :
496aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_allocated_area(NULL),
497aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_materialized_location(NULL)
498aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
499aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
500aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
501aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        Process                    *m_process;                  ///< The process that the struct is materialized into.
502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t                m_allocated_area;           ///< The base of the memory allocated for the struct.  Starts on a potentially unaligned address and may therefore be larger than the struct.
503aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t                m_materialized_location;    ///< The address at which the struct is placed.  Falls inside the allocated area.
504aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
505aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
506aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<MaterialVars> m_material_vars;
507aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
508aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
509aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate materialization-specific variables
510aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
511aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void EnableMaterialVars()
512aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_material_vars.get())
514aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars.reset(new struct MaterialVars);
515aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
517aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
518aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate materialization-specific variables
519aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
520aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void DisableMaterialVars()
521aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
522aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars.reset();
523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
525a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
526cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// Given a stack frame, find a variable that matches the given name and
527cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// type.  We need this for expression re-use; we may not always get the
528cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// same lldb::Variable back, and we want the expression to work wherever
529cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// it can.  Returns the variable defined in the tightest scope.
530a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
531cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// @param[in] frame
532cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    ///     The stack frame to use as a basis for finding the variable.
533a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
534a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
535a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.
536a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
537a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
538a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required type for the variable.  This function may be called
539a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
540a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     default.
541a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
542a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
543a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
544a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
545cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    Variable *FindVariableInScope(StackFrame &frame,
5468de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                  const ConstString &name,
547cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan                                  TypeFromUser *type = NULL);
548336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
549a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
550a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Get the value of a variable in a given execution context and return
551a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// the associated Types if needed.
552a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
553a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
554a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to look for the variable in.
555a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
556a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
557a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The variable to evaluate.
558a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
559a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] parser_ast_context
560a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The AST context of the parser, to store the found type in.
561a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
562a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] found_type
563a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was found in the user process.
564a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     This is only useful when the variable is being inspected on behalf
565a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of the parser, hence the default.
566a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
567a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] parser_type
568a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was copied into the parser's
569a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     AST context.  This is only useful when the variable is being
570a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     inspected on behalf of the parser, hence the default.
571a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
572a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
573a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Decl to be looked up.
574a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
575a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
576a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Value for the variable.
577a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
578336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Value *GetVariableValue(ExecutionContext &exe_ctx,
579336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                            Variable *var,
580f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                            clang::ASTContext *parser_ast_context,
581f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                            TypeFromUser *found_type = NULL,
582f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                            TypeFromParser *parser_type = NULL);
583336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
584a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
585a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
586a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Variable, and put it in the Tuple list.
587a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
588a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
589a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
590a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
591a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
592a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable that needs a Decl.
593a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
594cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    void AddOneVariable(NameSearchContext &context,
5953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                        Variable *var);
596a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
597a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
598a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
599a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// persistent variable, and put it in the Tuple list.
600a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
601a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
602a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
603a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
604a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] pvar
605a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The persistent variable that needs a Decl.
606a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
607a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void AddOneVariable(NameSearchContext &context, ClangExpressionVariable *pvar);
608a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
609a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
610a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
611a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// function.  (Functions are not placed in the Tuple list.)  Can
612a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// handle both fully typed functions and generic functions.
613a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
614a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
615a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
616a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
617a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] fun
618a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Function that needs to be created.  If non-NULL, this is
619a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a fully-typed function.
620a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
621a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym
622a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Symbol that corresponds to a function that needs to be
623a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     created with generic type (unitptr_t foo(...)).
624a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
6250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void AddOneFunction(NameSearchContext &context, Function *fun, Symbol *sym);
626a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
627a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
628a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
6291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register.
6301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
6311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] context
6321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
6331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
6341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
6351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information corresponding to that register.
6361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
6371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void AddOneRegister(NameSearchContext &context, const lldb::RegisterInfo *reg_info);
6381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
6391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
6401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
641a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// type.  (Types are not placed in the Tuple list.)
642a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
643a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
644a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
645a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
646a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
6473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The type that needs to be created.
6483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
6493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] add_method
6508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     True if a method with signature void $__lldb_expr(void*)
6513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     should be added to the C++ class type passed in
652a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
6533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    void AddOneType(NameSearchContext &context,
6543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                    TypeFromUser &type,
6553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                    bool add_method = false);
656810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
657a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
658a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing the struct.
659a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Since both tasks are very similar, although ClangExpressionDeclMap
660a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// exposes two functions to the outside, both call DoMaterialize.
661a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
662a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
663a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the struct is to be dematerialized; false if it is to
664a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
665a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
666a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
667a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
668a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
669a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
670a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     If the struct is being dematerialized, a pointer into which the
671a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     location of the result persistent variable is placed.  If not,
672a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     NULL.
673a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
674a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
675a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
676a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the struct.
677a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
678a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
679a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
680a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
681f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool DoMaterialize (bool dematerialize,
682aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                        ExecutionContext &exe_ctx,
683a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                        ClangExpressionVariable **result,
684f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                        Error &err);
685aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
686aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
687aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Clean up the state required to dematerialize the variable.
688aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
689aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    void DidDematerialize ();
690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
691a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
692a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a persistent
693a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
694a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
695a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
696a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
697a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
698a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
699a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
700a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
701a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
702a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
703a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the persistent variable.
704a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
705a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
706a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
707a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
708a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
709a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
710a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
711a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
712a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
713a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
714a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
715a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    bool DoMaterializeOnePersistentVariable(bool dematerialize,
716a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                            ExecutionContext &exe_ctx,
7178de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            const ConstString &name,
718a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                            lldb::addr_t addr,
719a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                            Error &err);
720a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
721a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
722a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a
723a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
724a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
725a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
726a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
727a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
728a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
729a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
730a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
731a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
732a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym_ctx
733a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The symbol context to use (for looking the variable up).
734a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
735a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
736a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the variable (for looking the variable up).
737a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
738a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
739a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required type of the variable (for looking the variable up).
740a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
741a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
742a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
743a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
744a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
745a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
746a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
747a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
748a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
749a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
750a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
751f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool DoMaterializeOneVariable(bool dematerialize,
752f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  ExecutionContext &exe_ctx,
753f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  const SymbolContext &sym_ctx,
7548de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                  const ConstString &name,
755f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  TypeFromUser type,
756f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  lldb::addr_t addr,
7571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                  Error &err);
7581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
7591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
7601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Actually do the task of materializing or dematerializing a
7611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register variable.
7621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] dematerialize
7641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
7651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     be materialized.
7661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] exe_ctx
7681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The execution context to use.
7691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_ctx
7711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The register context to use.
7721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
7741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information for the register to read/write.
7751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] addr
7771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The address at which to materialize the variable.
7781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] err
7801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     An Error to populate with any messages related to
7811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     (de)materializing the persistent variable.
7821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
7831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @return
7841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     True on success; false otherwise.
7851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
7861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool DoMaterializeOneRegister(bool dematerialize,
7871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                  ExecutionContext &exe_ctx,
7881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                  RegisterContext &reg_ctx,
7891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                  const lldb::RegisterInfo &reg_info,
7901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                  lldb::addr_t addr,
791f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  Error &err);
792ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
793ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    //------------------------------------------------------------------
794ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// A wrapper for ClangASTContext::CopyType that sets a flag that
795ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// indicates that we should not respond to queries during import.
796ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
797ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] dest_context
798ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The target AST context, typically the parser's AST context.
799ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
800ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] source_context
801ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The source AST context, typically the AST context of whatever
802ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     symbol file the type was found in.
803ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
804ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] clang_type
805ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The source type.
806ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
807ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @return
808ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The imported type.
809ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    //------------------------------------------------------------------
810ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *GuardedCopyType (clang::ASTContext *dest_context,
811ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                           clang::ASTContext *source_context,
812ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                           void *clang_type);
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionDeclMap_h_
818