ClangExpressionDeclMap.h revision 6916e358c9725b75ed91f31236c147f26c9af10e
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.
74a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
75a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
76a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use when finding types for variables.
77a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     Also used to find a "scratch" AST context to store result types.
78a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
79a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    ClangExpressionDeclMap(ExecutionContext *exe_ctx);
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
82a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Destructor
83a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
84a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ~ClangExpressionDeclMap();
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
87a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get a new result variable name of the form
88a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     $n, where n is a natural number starting with 0.
89a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
90a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
91a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The std::string to place the name into.
92a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
938de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &
948de27c761a22187ef63fb60000894be163e7285fGreg Clayton    GetPersistentResultName ();
95a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    clang::NamespaceDecl *
976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    AddNamespace (NameSearchContext &context,
986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                  const ClangNamespaceDecl &namespace_decl);
996916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
100a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
101a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the list of persistent
102a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     variables for the process.
103a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1048c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] decl
1058c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The Clang declaration for the persistent variable, used for
1068c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     lookup during parsing.
1078c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
108a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
109a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the persistent variable, usually $something.
110a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
111a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
112a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the variable, in the Clang parser's context.
113a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
114a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
115a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
116a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1178c12720c108cd5e7ed792596749218d8400f647eSean Callanan    bool AddPersistentVariable (const clang::NamedDecl *decl,
1188de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                const ConstString &name,
1198c12720c108cd5e7ed792596749218d8400f647eSean Callanan                                TypeFromParser type);
120a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
121a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
122a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the struct that needs to
123a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized each time the expression runs.
124a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
125a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
126a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Clang declaration for the variable.
127a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
12845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[in] name
12945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the variable.
13045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
1318c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] value
1328c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The LLVM IR value for this variable.
133a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
134a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] size
135a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the variable in bytes.
136a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
137a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] alignment
138a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required alignment of the variable in bytes.
139a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
140a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
141a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
142a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1438c12720c108cd5e7ed792596749218d8400f647eSean Callanan    bool AddValueToStruct (const clang::NamedDecl *decl,
1448de27c761a22187ef63fb60000894be163e7285fGreg Clayton                           const ConstString &name,
1458c12720c108cd5e7ed792596749218d8400f647eSean Callanan                           llvm::Value *value,
1468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           size_t size,
1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           off_t alignment);
148a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
149a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
150a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Finalize the struct, laying out the position
151a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of each object in it.
152a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
153a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
154a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
155a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool DoStructLayout ();
157a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
158a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
159a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get general information about the laid-out
160a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct after DoStructLayout() has been called.
161a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
162a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] num_elements
163a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The number of elements in the struct.
164a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
165a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] size
166a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the struct, in bytes.
167a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
168a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] alignment
169a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The alignment of the struct, in bytes.
170a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
171a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
172a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
173a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool GetStructInfo (uint32_t &num_elements,
1758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                        size_t &size,
1768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                        off_t &alignment);
177a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
178a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
179a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get specific information about one field
180a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of the laid-out struct after DoStructLayout() has been called.
181a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
182a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] decl
183a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the field, as generated by ClangASTSource
184a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.  In the case of the result
1858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     value, this will have the name $__lldb_result even if the
186a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     result value ends up having the name $1.  This is an
187a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     implementation detail of IRForTarget.
188a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
189a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
190a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The IR value for the field (usually a GlobalVariable).  In
191a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     the case of the result value, this will have the correct
192a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     name ($1, for instance).  This is an implementation detail
193a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of IRForTarget.
194a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
195a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] offset
196a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The offset of the field from the beginning of the struct.
197a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     As long as the struct is aligned according to its required
198a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     alignment, this offset will align the field correctly.
199a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
20045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[out] name
20145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the field as used in materialization.
20245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
203a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] index
204a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The index of the field about which information is requested.
205a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
206a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
207a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
208a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
2098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool GetStructElement (const clang::NamedDecl *&decl,
2108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           llvm::Value *&value,
2118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           off_t &offset,
2128de27c761a22187ef63fb60000894be163e7285fGreg Clayton                           ConstString &name,
2138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           uint32_t index);
2148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
215a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
216a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get information about a function given its
217a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Decl.
218a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
219a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
220a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the Function, as generated by ClangASTSource
221a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.
222a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
223a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
224a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     A pointer to the address where a Value for the function's address
225a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     can be stored.  IRForTarget typically places a ConstantExpr here.
226a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
227a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
228a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
229a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
230a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
231a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
232a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
23302fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan    bool GetFunctionInfo (const clang::NamedDecl *decl,
23402fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan                          llvm::Value**& value,
23502fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan                          uint64_t &ptr);
236a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
237a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
238a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get the address of a function given nothing
239a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// but its name.  Some functions are needed but didn't get Decls made
240a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// during parsing -- specifically, sel_registerName is never called
241a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// in the generated IR but we need to call it nonetheless.
242a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
243a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
244a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the function.
245a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
246a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
247a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
248a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
249a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
250a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the address could be retrieved; false otherwise.
251a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
2528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool GetFunctionAddress (const ConstString &name,
253f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan                             uint64_t &ptr);
254f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
255a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
256a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Materialize the entire struct
257a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// at a given address, which should be aligned as specified by
258a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// GetStructInfo().
259a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
260a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
261a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context at which to dump the struct.
262a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
263a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] struct_address
264a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which the struct should be written.
265a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
266a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
267a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
268a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     materializing the struct.
269a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
270a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
271a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
272a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
273f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool Materialize(ExecutionContext *exe_ctx,
274f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                     lldb::addr_t &struct_address,
275f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                     Error &error);
276f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
277a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
2783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// [Used by CommandObjectExpression] Get the "this" pointer
2793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// from a given execution context.
2803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
2813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[out] object_ptr
2823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The this pointer.
2833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
2843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] exe_ctx
2853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The execution context at which to dump the struct.
2863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
2873c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] error
2883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     An Error to populate with any messages related to
2893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     finding the "this" pointer.
2903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
2913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @return
2923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     True on success; false otherwise.
2933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
2943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    bool GetObjectPointer(lldb::addr_t &object_ptr,
2953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                          ExecutionContext *exe_ctx,
2963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                          Error &error);
2973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
2983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
299a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Pretty-print a materialized
300a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct, which must have been materialized by Materialize(),
301a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// byte for byte on a given stream.
302a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
303a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
304a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
305a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
306a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] s
307a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The stream on which to write the pretty-printed output.
308a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
309a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
310a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
311a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     pretty-printing the struct.
312a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
313a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
314a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
315a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
31632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    bool DumpMaterializedStruct(ExecutionContext *exe_ctx,
31732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan                                Stream &s,
31832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan                                Error &error);
31932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
320a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
321a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Deaterialize the entire struct.
322a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
323a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
324a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
325a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
326a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
327a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     A ClangExpressionVariable containing the result of the
328a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     expression, for potential re-use.
329a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
330a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
331a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
332a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     dematerializing the struct.
333a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
334a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
335a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
336a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
337f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool Dematerialize(ExecutionContext *exe_ctx,
338a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                       ClangExpressionVariable *&result,
339f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                       Error &error);
340810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
341a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
342a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
343a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// using a NameSearchContext to make Decls for them.
344a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
345a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
346a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
347a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
348a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
349a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
350a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
351a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
352a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     it can't access DeclarationName.
353a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
354a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
355a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
356a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void GetDecls (NameSearchContext &context,
3588de27c761a22187ef63fb60000894be163e7285fGreg Clayton                   const ConstString &name);
3598de27c761a22187ef63fb60000894be163e7285fGreg Clayton
3608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool
3618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    GetLookupsEnabled ()
3628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3638de27c761a22187ef63fb60000894be163e7285fGreg Clayton        return m_enable_lookups;
3648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
3658de27c761a22187ef63fb60000894be163e7285fGreg Clayton
3668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    void
3678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    SetLookupsEnabled (bool b)
3688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3698de27c761a22187ef63fb60000894be163e7285fGreg Clayton        m_enable_lookups = b;
3708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
3718de27c761a22187ef63fb60000894be163e7285fGreg Clayton
372a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callananprivate:
3738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariableStore    m_found_entities;       ///< All entities that were looked up for the parser.
3748c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariableList     m_struct_members;       ///< All entities that need to be placed in the struct.
3758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext            m_exe_ctx;                  ///< The execution context where this expression was first defined.  It determines types for all the external variables, even if the expression is re-used.
3778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    SymbolContext               m_sym_ctx;                  ///< [owned by ClangExpressionDeclMap] The symbol context where this expression was first defined.
378a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ClangPersistentVariables   *m_persistent_vars;          ///< The list of persistent variables to use when resolving symbols in the expression and when creating new ones (like the result).
379a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    off_t                       m_struct_alignment;         ///< The alignment of the struct in bytes.
380a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    size_t                      m_struct_size;              ///< The size of the struct in bytes.
381a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean 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).
3828de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool                        m_enable_lookups;           ///< Set to true during expression evaluation if we have found the first "$__lldb" name.
383a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean 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.
384a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    lldb::addr_t                m_materialized_location;    ///< The address at which the struct is placed.  Falls inside the allocated area.
3858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString                 m_result_name;              ///< The name of the result variable ($1, for example)
3863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromUser                m_object_pointer_type;      ///< The type of the "this" variable, if one exists.
387a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
3886df0840c87be29724055716db951aa6d494ddabcSean Callanan    llvm::DenseMap <const char*, bool>  m_lookedup_types;   ///< Contains each type that has been looked up in the current type lookup stack.
3896df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///< m_lookedup_types is used to gate the type search in GetDecls().  If a name is
3906df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///< not in it, the following procedure occurs:
3916df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///<   1 The name is added to m_lookedup_types.
3926df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///<   2 The type is looked up and added, potentially causing more type loookups.
3936df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///<   3 The name is removed from m_lookedup_types.
3946df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///< There must be no non-fatal error path that permits the type search to complete
3956df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///< without removing the name from m_lookedup_types at the end.
3966df0840c87be29724055716db951aa6d494ddabcSean Callanan                                                            ///< m_lookedup_type assumes single threadedness.
3976df0840c87be29724055716db951aa6d494ddabcSean Callanan
398a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
399cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// Given a stack frame, find a variable that matches the given name and
400cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// type.  We need this for expression re-use; we may not always get the
401cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// same lldb::Variable back, and we want the expression to work wherever
402cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// it can.  Returns the variable defined in the tightest scope.
403a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
404cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// @param[in] frame
405cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    ///     The stack frame to use as a basis for finding the variable.
406a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
407a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
408a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.
409a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
410a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
411a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required type for the variable.  This function may be called
412a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
413a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     default.
414a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
415a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
416a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
417a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
418cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    Variable *FindVariableInScope(StackFrame &frame,
4198de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                  const ConstString &name,
420cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan                                  TypeFromUser *type = NULL);
421336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
422a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
423a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Get the value of a variable in a given execution context and return
424a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// the associated Types if needed.
425a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
426a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
427a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to look for the variable in.
428a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
429a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
430a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The variable to evaluate.
431a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
432a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] parser_ast_context
433a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The AST context of the parser, to store the found type in.
434a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
435a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] found_type
436a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was found in the user process.
437a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     This is only useful when the variable is being inspected on behalf
438a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of the parser, hence the default.
439a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
440a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] parser_type
441a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was copied into the parser's
442a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     AST context.  This is only useful when the variable is being
443a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     inspected on behalf of the parser, hence the default.
444a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
445a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
446a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Decl to be looked up.
447a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
448a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
449a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Value for the variable.
450a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
451336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Value *GetVariableValue(ExecutionContext &exe_ctx,
452336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                            Variable *var,
453f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                            clang::ASTContext *parser_ast_context,
454f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                            TypeFromUser *found_type = NULL,
455f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                            TypeFromParser *parser_type = NULL);
456336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
457a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
458a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
459a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Variable, and put it in the Tuple list.
460a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
461a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
462a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
463a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
464a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
465a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable that needs a Decl.
466a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
467cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    void AddOneVariable(NameSearchContext &context,
4683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                        Variable *var);
469a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
470a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
471a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
472a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// persistent variable, and put it in the Tuple list.
473a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
474a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
475a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
476a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
477a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] pvar
478a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The persistent variable that needs a Decl.
479a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
480a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    void AddOneVariable(NameSearchContext &context, ClangExpressionVariable *pvar);
481a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
482a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
483a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
484a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// function.  (Functions are not placed in the Tuple list.)  Can
485a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// handle both fully typed functions and generic functions.
486a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
487a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
488a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
489a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
490a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] fun
491a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Function that needs to be created.  If non-NULL, this is
492a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a fully-typed function.
493a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
494a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym
495a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Symbol that corresponds to a function that needs to be
496a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     created with generic type (unitptr_t foo(...)).
497a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
4980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void AddOneFunction(NameSearchContext &context, Function *fun, Symbol *sym);
499a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
500a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
501a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
502a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// type.  (Types are not placed in the Tuple list.)
503a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
504a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
505a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
506a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
507a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
5083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The type that needs to be created.
5093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] add_method
5118de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     True if a method with signature void $__lldb_expr(void*)
5123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     should be added to the C++ class type passed in
513a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
5143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    void AddOneType(NameSearchContext &context,
5153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                    TypeFromUser &type,
5163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                    bool add_method = false);
517810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
518a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
519a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing the struct.
520a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Since both tasks are very similar, although ClangExpressionDeclMap
521a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// exposes two functions to the outside, both call DoMaterialize.
522a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
523a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
524a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the struct is to be dematerialized; false if it is to
525a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
526a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
527a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
528a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
529a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
530a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
531a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     If the struct is being dematerialized, a pointer into which the
532a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     location of the result persistent variable is placed.  If not,
533a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     NULL.
534a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
535a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
536a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
537a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the struct.
538a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
539a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
540a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
541a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
542f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool DoMaterialize (bool dematerialize,
543f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                        ExecutionContext *exe_ctx,
544a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                        ClangExpressionVariable **result,
545f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                        Error &err);
546f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
547a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
548a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a persistent
549a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
550a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
551a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
552a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
553a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
554a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
555a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
556a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
557a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
558a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
559a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the persistent variable.
560a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
561a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
562a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
563a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
564a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
565a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
566a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
567a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
568a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
569a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
570a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
571a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    bool DoMaterializeOnePersistentVariable(bool dematerialize,
572a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                            ExecutionContext &exe_ctx,
5738de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            const ConstString &name,
574a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                            lldb::addr_t addr,
575a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                            Error &err);
576a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
577a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
578a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a
579a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
580a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
581a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
582a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
583a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
584a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
585a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
586a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
587a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
588a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym_ctx
589a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The symbol context to use (for looking the variable up).
590a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
591a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
592a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the variable (for looking the variable up).
593a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
594a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
595a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required type of the variable (for looking the variable up).
596a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
597a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
598a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
599a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
600a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
601a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
602a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
603a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
604a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
605a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
606a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool DoMaterializeOneVariable(bool dematerialize,
608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  ExecutionContext &exe_ctx,
609f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  const SymbolContext &sym_ctx,
6108de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                  const ConstString &name,
611f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  TypeFromUser type,
612f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  lldb::addr_t addr,
613f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                  Error &err);
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionDeclMap_h_
619