ClangExpressionDeclMap.h revision a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9
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
22f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "llvm/ADT/APInt.h"
236df0840c87be29724055716db951aa6d494ddabcSean Callanan#include "llvm/ADT/DenseMap.h"
249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan#include "clang/AST/Decl.h"
25b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-public.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h"
28a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Expression/ClangExpressionVariable.h"
29e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton#include "lldb/Symbol/ClangASTImporter.h"
30841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan#include "lldb/Symbol/TaggedASTType.h"
318de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Symbol/SymbolContext.h"
328de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Target/ExecutionContext.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan//----------------------------------------------------------------------
37a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// @class ClangExpressionDeclMap ClangExpressionDeclMap.h "lldb/Expression/ClangExpressionDeclMap.h"
38a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// @brief Manages named entities that are defined in LLDB's debug information.
39a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
40a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// The Clang parser uses the ClangASTSource as an interface to request named
41a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// entities from outside an expression.  The ClangASTSource reports back, listing
42a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// all possible objects corresponding to a particular name.  But it in turn
43a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// relies on ClangExpressionDeclMap, which performs several important functions.
44a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
45a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// First, it records what variables and functions were looked up and what Decls
46a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// were returned for them.
47a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
48a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Second, it constructs a struct on behalf of IRForTarget, recording which
49a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// variables should be placed where and relaying this information back so that
50a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// IRForTarget can generate context-independent code.
51a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
52a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Third, it "materializes" this struct on behalf of the expression command,
53a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// finding the current values of each variable and placing them into the
54a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// struct so that it can be passed to the JITted version of the IR.
55a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
56a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Fourth and finally, it "dematerializes" the struct after the JITted code has
57a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// has executed, placing the new values back where it found the old ones.
58a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan//----------------------------------------------------------------------
59a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callananclass ClangExpressionDeclMap : public ClangASTImporter::NamespaceMapCompleter
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
62a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
63a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Constructor
64a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    /// Initializes class variables.
666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///
676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    /// @param[in] keep_result_in_memory
686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     If true, inhibits the normal deallocation of the memory for
696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     the result persistent variable, and instead marks the variable
706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     as persisting.
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionDeclMap (bool keep_result_in_memory);
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Destructor
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
77427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ~ClangExpressionDeclMap ();
78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
80aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Enable the state needed for parsing and IR transformation.
81a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
82a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
83a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use when finding types for variables.
84a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     Also used to find a "scratch" AST context to store result types.
85166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    ///
86166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    /// @return
87166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    ///     True if parsing is possible; false if it is unsafe to continue.
88a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
89166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    bool
90427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    WillParse (ExecutionContext &exe_ctx);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
93fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    /// [Used by ClangExpressionParser] For each variable that had an unknown
94fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ///     type at the beginning of parsing, determine its final type now.
95fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ///
96fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    /// @return
97fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ///     True on success; false otherwise.
98fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //------------------------------------------------------------------
99fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    bool
100fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ResolveUnknownTypes();
101fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
102fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //------------------------------------------------------------------
103aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Disable the state needed for parsing and IR transformation.
104a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DidParse ();
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
109a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get a new result variable name of the form
110a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     $n, where n is a natural number starting with 0.
111a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
112a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
113a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The std::string to place the name into.
114a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &
1168de27c761a22187ef63fb60000894be163e7285fGreg Clayton    GetPersistentResultName ();
117a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1186916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    clang::NamespaceDecl *
1196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    AddNamespace (NameSearchContext &context,
12016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                  ClangASTImporter::NamespaceMapSP &namespace_decls);
1216916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
122a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
12305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    /// [Used by IRForTarget] Get a constant variable given a name,
12405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///     a type, and an llvm::APInt.
12505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///
12605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    /// @param[in] name
12705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///     The name of the variable
12805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///
12905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    /// @param[in] type
13005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///     The type of the variable, which will be imported into the
13105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///     target's AST context
13205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///
13305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    /// @param[in] value
13405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///     The value of the variable
13505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///
13605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    /// @return
13705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ///     The created variable
13805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    //------------------------------------------------------------------
13905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    lldb::ClangExpressionVariableSP
14005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    BuildIntegerVariable (const ConstString &name,
14105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                          lldb_private::TypeFromParser type,
14205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                          const llvm::APInt& value);
14305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
14405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    //------------------------------------------------------------------
145696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    /// [Used by IRForTarget] Cast an existing variable given a Decl and
146696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///     a type.
147696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///
148696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    /// @param[in] name
149696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///     The name of the new variable
150696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///
151696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    /// @param[in] decl
152696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///     The Clang variable declaration for the original variable,
153696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///     which must be looked up in the map
154696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///
155696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    /// @param[in] type
156696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///     The desired type of the variable after casting
157696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///
158696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    /// @return
159696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ///     The created variable
160696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    //------------------------------------------------------------------
161696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::ClangExpressionVariableSP
162696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    BuildCastVariable (const ConstString &name,
163696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                       clang::VarDecl *decl,
164696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                       lldb_private::TypeFromParser type);
165696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
166696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    //------------------------------------------------------------------
167a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the list of persistent
168a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     variables for the process.
169a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] decl
1718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The Clang declaration for the persistent variable, used for
1728c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     lookup during parsing.
1738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
174a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
175a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the persistent variable, usually $something.
176a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
177a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
178a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the variable, in the Clang parser's context.
179a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
180a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
181a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
182a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddPersistentVariable (const clang::NamedDecl *decl,
185427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                           const ConstString &name,
1866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                           TypeFromParser type,
1876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                           bool is_result,
1886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                           bool is_lvalue);
189a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
190a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
191a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the struct that needs to
192a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized each time the expression runs.
193a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
194a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
195a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Clang declaration for the variable.
196a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
19745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[in] name
19845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the variable.
19945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
2008c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] value
2018c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The LLVM IR value for this variable.
202a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
203a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] size
204a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the variable in bytes.
205a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
206a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] alignment
207a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required alignment of the variable in bytes.
208a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
209a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
210a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
211a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
213427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddValueToStruct (const clang::NamedDecl *decl,
214427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      const ConstString &name,
215427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      llvm::Value *value,
216427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      size_t size,
217427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      off_t alignment);
218a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
219a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
220a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Finalize the struct, laying out the position
221a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of each object in it.
222a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
223a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
224a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
225a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
227427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoStructLayout ();
228a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
229a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
230a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get general information about the laid-out
231a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct after DoStructLayout() has been called.
232a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
233a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] num_elements
234a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The number of elements in the struct.
235a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
236a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] size
237a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the struct, in bytes.
238a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
239a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] alignment
240a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The alignment of the struct, in bytes.
241a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
242a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
243a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
244a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetStructInfo (uint32_t &num_elements,
247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   size_t &size,
248427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   off_t &alignment);
249a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
250a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
251a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get specific information about one field
252a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of the laid-out struct after DoStructLayout() has been called.
253a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
254a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] decl
255a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the field, as generated by ClangASTSource
256a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.  In the case of the result
2578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     value, this will have the name $__lldb_result even if the
258a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     result value ends up having the name $1.  This is an
259a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     implementation detail of IRForTarget.
260a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
261a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
262a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The IR value for the field (usually a GlobalVariable).  In
263a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     the case of the result value, this will have the correct
264a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     name ($1, for instance).  This is an implementation detail
265a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of IRForTarget.
266a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
267a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] offset
268a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The offset of the field from the beginning of the struct.
269a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     As long as the struct is aligned according to its required
270a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     alignment, this offset will align the field correctly.
271a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
27245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[out] name
27345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the field as used in materialization.
27445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
275a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] index
276a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The index of the field about which information is requested.
277a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
278a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
279a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
280a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
281427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetStructElement (const clang::NamedDecl *&decl,
283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      llvm::Value *&value,
284427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      off_t &offset,
285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      ConstString &name,
286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      uint32_t index);
2878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
288a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
289a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get information about a function given its
290a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Decl.
291a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
292a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
293a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the Function, as generated by ClangASTSource
294a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.
295a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
296a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
297a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     A pointer to the address where a Value for the function's address
298a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     can be stored.  IRForTarget typically places a ConstantExpr here.
299a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
300a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
301a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
302a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
303a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
304a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
305a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
306427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
307427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetFunctionInfo (const clang::NamedDecl *decl,
308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     llvm::Value**& value,
309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     uint64_t &ptr);
310a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
311a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
312a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get the address of a function given nothing
313a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// but its name.  Some functions are needed but didn't get Decls made
314a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// during parsing -- specifically, sel_registerName is never called
315a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// in the generated IR but we need to call it nonetheless.
316a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
317a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
318a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the function.
319a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
320a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
321a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
322a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
323a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
324a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the address could be retrieved; false otherwise.
325a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
326427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetFunctionAddress (const ConstString &name,
328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        uint64_t &ptr);
329f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
330a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
331c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// [Used by IRForTarget] Get the address of a symbol given nothing
332c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// but its name.
333c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    ///
334819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] target
335819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The target to find the symbol in.  If not provided,
336819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     then the current parsing context's Target.
337819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
338c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// @param[in] name
339c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    ///     The name of the symbol.
340c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    ///
341c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// @return
342cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    ///     Valid load address for the symbol
343c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    //------------------------------------------------------------------
344cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    lldb::addr_t
345819749647b1605f75753f625050cb240292c08b0Sean Callanan    GetSymbolAddress (Target &target,
346cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                      const ConstString &name);
347819749647b1605f75753f625050cb240292c08b0Sean Callanan
348cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    lldb::addr_t
349cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    GetSymbolAddress (const ConstString &name);
350c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
351c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    //------------------------------------------------------------------
35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Get basic target information.
35347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
35447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[out] byte_order
35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The byte order of the target.
35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[out] address_byte_size
35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The size of a pointer in bytes.
35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the information could be determined; false
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     otherwise.
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    struct TargetInfo
36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb::ByteOrder byte_order;
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        size_t address_byte_size;
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TargetInfo() :
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            byte_order(lldb::eByteOrderInvalid),
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            address_byte_size(0)
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        bool IsValid()
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return (byte_order != lldb::eByteOrderInvalid &&
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    address_byte_size != 0);
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    };
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo GetTargetInfo();
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
384557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// [Used by IRInterpreter] Promote an unknown address to a
385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///     LoadAddress or FileAddress depending on the presence of a
386557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///     process.
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] addr
389557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///     The address to promote.
390557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///
391557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// @return
392557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///     The wrapped entity.
393557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    //------------------------------------------------------------------
394557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    lldb_private::Value WrapBareAddress (lldb::addr_t addr);
395557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
396557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    //------------------------------------------------------------------
397557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// [Used by IRInterpreter] Write to the target.
398557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///
399557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// @param[in] value
40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address to write to.
40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
402557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// @param[in] addr
40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address of the data buffer to read from.
40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] length
40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The amount of data to write, in bytes.
40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the write could be performed; false otherwise.
41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    WriteTarget (lldb_private::Value &value,
41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                 const uint8_t *data,
41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                 size_t length);
41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Read from the target.
41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] data
42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address of the data buffer to write to.
42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
422557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// @param[in] value
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address to read from.
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] length
42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The amount of data to read, in bytes.
42747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the read could be performed; false otherwise.
43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ReadTarget (uint8_t *data,
43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                lldb_private::Value &value,
43447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                size_t length);
435557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
43647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
43747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Get the Value for a NamedDecl.
43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] decl
44047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The Decl whose value is to be found.
44147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
44247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
44347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The value, or NULL.
44447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
44547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    lldb_private::Value
44647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    LookupDecl (clang::NamedDecl *decl);
44747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
44847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
44947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Returns true if the result is a
45047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///   reference to data in the target, meaning it must be
45147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///   dereferenced once more to get its data.
45247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
45347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
45447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name of the result.
45547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
45647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
45747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the result is a reference; false otherwise (or on
45847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     error).
45947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
46047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
46147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ResultIsReference (const ConstString &name);
46247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
46347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
46447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Find the result persistent variable,
46547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///   propagate the given value to it, and return it.
46647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
46747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[out] valobj
46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     Set to the complete object.
46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] value
47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     A value indicating the location of the value's contents.
47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name of the result.
47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] type
47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The type of the data.
47847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
479a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    /// @param[in] transient
480a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    ///     True if the data should be treated as disappearing after the
481a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    ///     expression completes.  In that case, it gets no live data.
482a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    ///
483557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    /// @param[in] maybe_make_load
484557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///     True if the value is a file address but should be potentially
485557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///     upgraded to a load address if a target is presence.
486557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ///
48747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
48847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True on success; false otherwise.
48947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
49047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
49147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
49247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                            lldb_private::Value &value,
49347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                            const ConstString &name,
494a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                            lldb_private::TypeFromParser type,
495557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                            bool transient,
496557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                            bool maybe_make_load);
49747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
49847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
499a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Materialize the entire struct
500a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// at a given address, which should be aligned as specified by
501a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// GetStructInfo().
502a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
503a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
504a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context at which to dump the struct.
505a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
506a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] struct_address
507a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which the struct should be written.
508a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
509a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
510a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
511a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     materializing the struct.
512a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
513a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
514a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
515a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
516427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
517427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    Materialize (ExecutionContext &exe_ctx,
518427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                 lldb::addr_t &struct_address,
519427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                 Error &error);
520f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
521a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
5223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// [Used by CommandObjectExpression] Get the "this" pointer
5233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// from a given execution context.
5243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[out] object_ptr
5263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The this pointer.
5273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    /// @param[in] object_name
5293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///     The name of the object pointer -- "this," "self," or similar
5303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///     depending on language
5313aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///
5323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] exe_ctx
5333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The execution context at which to dump the struct.
5343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] error
5363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     An Error to populate with any messages related to
5373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     finding the "this" pointer.
5383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
539047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    /// @param[in] suppress_type_check
540047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    ///     True if the type is not needed.
541047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    ///
5423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @return
5433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     True on success; false otherwise.
5443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
546427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetObjectPointer (lldb::addr_t &object_ptr,
547427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      ConstString &object_name,
548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      ExecutionContext &exe_ctx,
549427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      Error &error,
550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      bool suppress_type_check = false);
5513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
553a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Pretty-print a materialized
554a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct, which must have been materialized by Materialize(),
555a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// byte for byte on a given stream.
556a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
557a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
558a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
559a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
560a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] s
561a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The stream on which to write the pretty-printed output.
562a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
563a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
564a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
565a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     pretty-printing the struct.
566a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
567a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
568a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
569a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
570427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
571427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DumpMaterializedStruct (ExecutionContext &exe_ctx,
572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                            Stream &s,
573427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                            Error &error);
57432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
575a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
576a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Deaterialize the entire struct.
577a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
578a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
579a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
580a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
581a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
582a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     A ClangExpressionVariable containing the result of the
583a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     expression, for potential re-use.
584a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
5850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    /// @param[in] stack_frame_top, stack_frame_bottom
5860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     If not LLDB_INVALID_ADDRESS, the bounds for the stack frame
5870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     in which the expression ran.  A result whose address falls
5880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     inside this stack frame is dematerialized as a value
5890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     requiring rematerialization.
5900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///
591a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
592a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
593a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     dematerializing the struct.
594a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
595a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
596a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
597a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
599427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    Dematerialize (ExecutionContext &exe_ctx,
600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   lldb::ClangExpressionVariableSP &result_sp,
6010ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_top,
6020ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_bottom,
603427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   Error &error);
604810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
605a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
606a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
607a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// using a NameSearchContext to make Decls for them.
608a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
609a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
610a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
611a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
612a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
613a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
614a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
615a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
616a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     it can't access DeclarationName.
617a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
618a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
619a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
620a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
621427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
62216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    FindExternalVisibleDecls (NameSearchContext &context,
62316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                              const ConstString &name);
624aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
625aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
6269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// [Used by ClangASTSource] Find all Decls in a context that match
6279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// a given criterion.
628e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ///
629e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    /// @param[in] decl_context
6309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     The DeclContext to search.
631e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ///
6329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] predicate
6339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     Returns True if a DeclKind is desired; False if not.
6349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///
6359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] decls
6369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     A list to add all found Decls that have a desired DeclKind
6379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     into.
6389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    clang::ExternalLoadResult
6409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    FindExternalLexicalDecls (const clang::DeclContext *decl_context,
6419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                              bool (*predicate)(clang::Decl::Kind),
6429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                              llvm::SmallVectorImpl<clang::Decl*> &decls);
6439b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
6449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6459b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// [Used by ClangASTSource] Complete the definition of a TagDecl.
6469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///
6479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] tag_decl
6489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     The TagDecl to be completed.
649e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    //------------------------------------------------------------------
6509b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    void
6519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    CompleteTagDecl (clang::TagDecl *tag_decl);
6529b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
6539b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6549b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// [Used by ClangASTSource] Complete the definition of an
6559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// ObjCInterfaceDecl.
6569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///
6579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] tag_decl
6589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     The ObjCInterfaceDecl to be completed.
6599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    void
6619b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl);
662e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
663e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    //------------------------------------------------------------------
664aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// [Used by ClangASTSource] Report whether a $__lldb variable has
665aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// been searched for yet.  This is the trigger for beginning to
666aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// actually look for externally-defined names.  (Names that come
667aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// before this are typically the names of built-ins that don't need
668aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// to be looked up.)
669aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ///
670aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// @return
671aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ///     True if a $__lldb variable has been found.
672aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool
674b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetLookupsEnabled () const
6758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
676aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        assert(m_parser_vars.get());
677aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        return m_parser_vars->m_enable_lookups;
6788de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
679b01000fd063629facd45044f137446fb748ee179Greg Clayton
680b01000fd063629facd45044f137446fb748ee179Greg Clayton    bool
681b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetImportInProgress () const
682b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
683b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (m_parser_vars.get())
684b01000fd063629facd45044f137446fb748ee179Greg Clayton            return m_parser_vars->m_ignore_lookups;
685b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
686b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
6878de27c761a22187ef63fb60000894be163e7285fGreg Clayton
688aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
689aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// [Used by ClangASTSource] Indicate that a $__lldb variable has
690aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// been found.
691aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
6928de27c761a22187ef63fb60000894be163e7285fGreg Clayton    void
693aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    SetLookupsEnabled ()
6948de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        assert(m_parser_vars.get());
696aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_enable_lookups = true;
6978de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
698a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
699a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    //------------------------------------------------------------------
700a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    /// [Used by ClangASTImporter] Look up the modules containing a
701a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    /// given namespace and put the appropriate entries in the namespace
702a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    /// map.
703a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///
704a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    /// @param[in] namespace_map
705a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///     The map to be completed.
706a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///
707a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    /// @param[in] name
708a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///     The name of the namespace to be found.
709a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///
710a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    /// @param[in] parent_map
711a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///     The map for the namespace's parent namespace, if there is
712a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    ///     one.
713a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    //------------------------------------------------------------------
714a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan    void CompleteNamespaceMap (ClangASTImporter::NamespaceMapSP &namespace_map,
715a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan                               const ConstString &name,
716a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan                               ClangASTImporter::NamespaceMapSP &parent_map) const;
7178de27c761a22187ef63fb60000894be163e7285fGreg Clayton
718a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callananprivate:
719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableList    m_found_entities;           ///< All entities that were looked up for the parser.
720427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableList    m_struct_members;           ///< All entities that need to be placed in the struct.
7216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool                           m_keep_result_in_memory;    ///< True if result persistent variables generated by this expression should stay in memory.
722aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
723aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
724aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values should not live beyond parsing
725aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
726bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    class ParserVars
727bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
728bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    public:
729a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        ParserVars(ClangExpressionDeclMap &decl_map) :
730a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            m_decl_map(decl_map),
731aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_exe_ctx(NULL),
732aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_sym_ctx(),
733aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_persistent_vars(NULL),
734aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_enable_lookups(false),
735aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_ignore_lookups(false)
736aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
737aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
738aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *
740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        GetTarget()
741427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
742567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (m_exe_ctx && m_exe_ctx->GetTargetPtr())
743567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                return m_exe_ctx->GetTargetPtr();
744427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            else if (m_sym_ctx.target_sp)
745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                m_sym_ctx.target_sp.get();
746427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return NULL;
747427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
748e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
749e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ClangASTImporter *GetASTImporter (clang::ASTContext *ast_context)
750e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
751e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            if (!m_ast_importer.get())
752e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                m_ast_importer.reset(new ClangASTImporter(ast_context));
753e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
754e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            if (m_ast_importer->TargetASTContext() != ast_context)
755e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                return NULL;
756e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
757a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            m_ast_importer->InstallMapCompleter(m_decl_map);
758a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
759e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return m_ast_importer.get();
760e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
761e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
762aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ExecutionContext           *m_exe_ctx;          ///< The execution context to use when parsing.
763aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        SymbolContext               m_sym_ctx;          ///< The symbol context to use in finding variables and types.
764aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ClangPersistentVariables   *m_persistent_vars;  ///< The persistent variables for the process.
765aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_enable_lookups;   ///< Set to true during parsing if we have found the first "$__lldb" name.
766aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_ignore_lookups;   ///< True during an import when we should be ignoring type lookups.
767e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        std::auto_ptr<ClangASTImporter> m_ast_importer; ///< The importer used to import types on the parser's behalf.
76847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TargetInfo                  m_target_info;      ///< Basic information about the target.
769bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    private:
770a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        ClangExpressionDeclMap     &m_decl_map;
771bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        DISALLOW_COPY_AND_ASSIGN (ParserVars);
772aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
773aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
774aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<ParserVars> m_parser_vars;
775aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
776aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
777aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate parser-specific variables
778aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
779427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
780427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableParserVars()
781aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
782aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_parser_vars.get())
783a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            m_parser_vars.reset(new ParserVars(*this));
784aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
786aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
787aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate parser-specific variables
788aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
789427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableParserVars()
791aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
792aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars.reset();
793aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
794aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
795aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
796aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values contain layout information for the materialized
797aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// struct, but are not specific to a single materialization
798aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
799aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct StructVars {
800aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        StructVars() :
801aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_alignment(0),
802aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_size(0),
803aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_laid_out(false),
804aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_result_name(),
805aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_object_pointer_type(NULL, NULL)
806aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
807aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
808aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
809aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        off_t                       m_struct_alignment;         ///< The alignment of the struct in bytes.
810aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        size_t                      m_struct_size;              ///< The size of the struct in bytes.
811aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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).
812aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ConstString                 m_result_name;              ///< The name of the result variable ($1, for example)
813aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TypeFromUser                m_object_pointer_type;      ///< The type of the "this" variable, if one exists
814aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
815aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
816aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<StructVars> m_struct_vars;
817aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
818aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
819aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate struct variables
820aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
822427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableStructVars()
823aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
824aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_struct_vars.get())
825aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars.reset(new struct StructVars);
826aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
827aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
828aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
829aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate struct variables
830aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
832427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableStructVars()
833aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
834aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_struct_vars.reset();
835aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
836aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
837aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
838aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values refer to a specific materialization of the
839aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// structure in a process
840aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
841aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct MaterialVars {
842aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        MaterialVars() :
8432bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen            m_allocated_area(0),
8442bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen            m_materialized_location(0)
845aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
846aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
847aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
848aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        Process                    *m_process;                  ///< The process that the struct is materialized into.
849aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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.
850aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t                m_materialized_location;    ///< The address at which the struct is placed.  Falls inside the allocated area.
851aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
852aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
853aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<MaterialVars> m_material_vars;
854aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
855aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
856aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate materialization-specific variables
857aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
858427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
859427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableMaterialVars()
860aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
861aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_material_vars.get())
862aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars.reset(new struct MaterialVars);
863aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
864aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
865aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
866aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate materialization-specific variables
867aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableMaterialVars()
870aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
871aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars.reset();
872aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
873aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
874a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
87516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
87616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// using a NameSearchContext to make Decls for them.
87716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
87816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @param[in] context
87916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
88016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
88116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @param[in] module
88216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     If non-NULL, the module to query.
88316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
88494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] namespace_decl
88594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If valid and module is non-NULL, the parent namespace.
88616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
88716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @param[in] name
88816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
88916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
89016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
89116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     it can't access DeclarationName.
89216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
89367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    /// @param[in] current_id
89467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     The ID for the current FindExternalVisibleDecls invocation,
89567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     for logging purposes.
89667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///
89716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @return
89816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     True on success; false otherwise.
89916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    //------------------------------------------------------------------
90016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    void
90116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    FindExternalVisibleDecls (NameSearchContext &context,
90216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                              lldb::ModuleSP module,
90303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                              ClangNamespaceDecl &namespace_decl,
90467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                              const ConstString &name,
90567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                              unsigned int current_id);
90616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
90716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    //------------------------------------------------------------------
908cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// Given a stack frame, find a variable that matches the given name and
909cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// type.  We need this for expression re-use; we may not always get the
910cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// same lldb::Variable back, and we want the expression to work wherever
911cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// it can.  Returns the variable defined in the tightest scope.
912a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
913cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// @param[in] frame
914cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    ///     The stack frame to use as a basis for finding the variable.
915a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
916a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
917a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.
918a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
919a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
920a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required type for the variable.  This function may be called
921a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
922a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     default.
923a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
924a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
925a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
926a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
927696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::VariableSP
928427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    FindVariableInScope (StackFrame &frame,
929427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                         const ConstString &name,
930427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                         TypeFromUser *type = NULL);
931336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
932a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
933819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// Given a target, find a data symbol that has the given name.
934819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
935819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] target
936819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The target to use as the basis for the search.
937819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
938819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] name
939819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The name as a plain C string.
940819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
941819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @return
942819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The LLDB Symbol found, or NULL if none was found.
943819749647b1605f75753f625050cb240292c08b0Sean Callanan    //---------------------------------------------------------
944819749647b1605f75753f625050cb240292c08b0Sean Callanan    Symbol *
945819749647b1605f75753f625050cb240292c08b0Sean Callanan    FindGlobalDataSymbol (Target &target,
946aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                          const ConstString &name);
947819749647b1605f75753f625050cb240292c08b0Sean Callanan
948819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// Given a target, find a variable that matches the given name and
95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// type.
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] target
95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The target to use as a basis for finding the variable.
95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
95594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] module
95694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If non-NULL, the module to search.
95794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///
95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name as a plain C string.
96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
96194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] namespace_decl
96294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If non-NULL and module is non-NULL, the parent namespace.
96394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] type
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The required type for the variable.  This function may be called
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     default.
96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    lldb::VariableSP
97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    FindGlobalVariable (Target &target,
97494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        lldb::ModuleSP &module,
97594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        const ConstString &name,
97694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        ClangNamespaceDecl *namespace_decl,
97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        TypeFromUser *type = NULL);
97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
980a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Get the value of a variable in a given execution context and return
981a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// the associated Types if needed.
982a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
983a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
984a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to look for the variable in.
985a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
986a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
987a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The variable to evaluate.
988a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
989a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] parser_ast_context
990a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The AST context of the parser, to store the found type in.
991a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
992a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] found_type
993a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was found in the user process.
994a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     This is only useful when the variable is being inspected on behalf
995a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of the parser, hence the default.
996a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
997a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] parser_type
998a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was copied into the parser's
999a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     AST context.  This is only useful when the variable is being
1000a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     inspected on behalf of the parser, hence the default.
1001a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1002a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
1003a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Decl to be looked up.
1004a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1005a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1006a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Value for the variable.
1007a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1008427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    Value *
1009427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetVariableValue (ExecutionContext &exe_ctx,
10104a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan                      lldb::VariableSP &var,
1011427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      clang::ASTContext *parser_ast_context,
1012427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      TypeFromUser *found_type = NULL,
1013427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      TypeFromParser *parser_type = NULL);
1014336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1015a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1016a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
1017a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Variable, and put it in the Tuple list.
1018a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1019a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
1020a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1021a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1022a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
1023a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable that needs a Decl.
1024a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1025427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1026427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneVariable (NameSearchContext &context,
102767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    lldb::VariableSP var,
102867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
1029a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1030a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1031a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
1032819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// persistent variable, and put it in the list of found entities.
1033a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1034a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
1035a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1036a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1037a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] pvar
1038a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The persistent variable that needs a Decl.
103967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///
104067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    /// @param[in] current_id
104167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     The ID of the current invocation of FindExternalVisibleDecls
104267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     for logging purposes.
1043a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1045427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneVariable (NameSearchContext &context,
104667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    lldb::ClangExpressionVariableSP &pvar_sp,
104767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
1048a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1049a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1050819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
1051819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// symbol (treated as a variable), and put it in the list of found
1052819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// entities.
1053819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
1054819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] context
1055819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1056819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
1057819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] var
1058819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The LLDB Variable that needs a Decl.
1059819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
1060819749647b1605f75753f625050cb240292c08b0Sean Callanan    void
1061819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddOneGenericVariable (NameSearchContext &context,
106267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                           Symbol &symbol,
106367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                           unsigned int current_id);
1064819749647b1605f75753f625050cb240292c08b0Sean Callanan
1065819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
1066a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
1067a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// function.  (Functions are not placed in the Tuple list.)  Can
1068a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// handle both fully typed functions and generic functions.
1069a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1070a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
1071a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1072a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1073a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] fun
1074a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Function that needs to be created.  If non-NULL, this is
1075a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a fully-typed function.
1076a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1077a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym
1078a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Symbol that corresponds to a function that needs to be
1079a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     created with generic type (unitptr_t foo(...)).
1080a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1081427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1082427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneFunction (NameSearchContext &context,
1083427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    Function *fun,
108467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    Symbol *sym,
108567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
1086a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1087a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1088a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
10891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register.
10901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
10911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] context
10921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
10931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
10941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
10951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information corresponding to that register.
10961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
1097427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1098427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneRegister (NameSearchContext &context,
109967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    const RegisterInfo *reg_info,
110067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
11011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
11021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
11031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
1104a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// type.  (Types are not placed in the Tuple list.)
1105a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1106a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
1107a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1108a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1109a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
11103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The type that needs to be created.
11113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
11123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] add_method
11138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     True if a method with signature void $__lldb_expr(void*)
11143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     should be added to the C++ class type passed in
1115a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneType (NameSearchContext &context,
111867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                TypeFromUser &type,
111967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                unsigned int current_id,
1120e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                bool add_method);
1121810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1122a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1123a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing the struct.
1124a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Since both tasks are very similar, although ClangExpressionDeclMap
1125a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// exposes two functions to the outside, both call DoMaterialize.
1126a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1127a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
1128a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the struct is to be dematerialized; false if it is to
1129a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
1130a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1131a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
1132a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
1133a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
11340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    /// @param[in] stack_frame_top, stack_frame_bottom
11350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     If not LLDB_INVALID_ADDRESS, the bounds for the stack frame
11360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     in which the expression ran.  A result whose address falls
11370ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     inside this stack frame is dematerialized as a value
11380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     requiring rematerialization.
11390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///
1140a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
1141a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     If the struct is being dematerialized, a pointer into which the
1142a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     location of the result persistent variable is placed.  If not,
1143a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     NULL.
1144a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1145a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
1146a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
1147a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the struct.
1148a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1149a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1150a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
1151a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1152427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1153427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterialize (bool dematerialize,
1154427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   ExecutionContext &exe_ctx,
11550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_top,
11560ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_bottom,
1157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   lldb::ClangExpressionVariableSP *result_sp_ptr,
1158427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   Error &err);
1159aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1160aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
1161aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Clean up the state required to dematerialize the variable.
1162aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
1163427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1164427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DidDematerialize ();
1165f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1166a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1167a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a persistent
1168a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
1169a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1170a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
1171a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
1172a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
1173a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1174a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
1175a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
1176a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    /// @param[in] var_sp
1178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ///     The persistent variable to materialize
1179a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1180a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
1181a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
1182a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
11830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    /// @param[in] stack_frame_top, stack_frame_bottom
11840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     If not LLDB_INVALID_ADDRESS, the bounds for the stack frame
11850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     in which the expression ran.  A result whose address falls
11860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     inside this stack frame is dematerialized as a value
11870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     requiring rematerialization.
11880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///
1189a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
1190a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
1191a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
1192a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1193a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1194a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
1195a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterializeOnePersistentVariable (bool dematerialize,
1198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        ExecutionContext &exe_ctx,
1199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        lldb::ClangExpressionVariableSP &var_sp,
1200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        lldb::addr_t addr,
12010ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                        lldb::addr_t stack_frame_top,
12020ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                        lldb::addr_t stack_frame_bottom,
1203427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        Error &err);
1204a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1205a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1206a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a
1207a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
1208a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1209a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
1210a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
1211a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
1212a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1213a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
1214a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
1215a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1216a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym_ctx
1217a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The symbol context to use (for looking the variable up).
1218a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
12196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    /// @param[in] expr_var
12206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     The entity that the expression parser uses for the variable.
12216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     In case the variable needs to be copied into the target's
12226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     memory, this location is stored in the variable during
12236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     materialization and cleared when it is demateralized.
1224a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1225a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
1226a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
1227a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1228a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
1229a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
1230a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
1231a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1232a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1233a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
1234a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterializeOneVariable (bool dematerialize,
1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              ExecutionContext &exe_ctx,
1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              const SymbolContext &sym_ctx,
12396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                              lldb::ClangExpressionVariableSP &expr_var,
1240427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              lldb::addr_t addr,
1241427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              Error &err);
12421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
12431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
12441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Actually do the task of materializing or dematerializing a
12451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register variable.
12461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] dematerialize
12481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
12491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     be materialized.
12501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] exe_ctx
12521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The execution context to use.
12531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_ctx
12551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The register context to use.
12561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
12581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information for the register to read/write.
12591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] addr
12611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The address at which to materialize the variable.
12621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] err
12641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     An Error to populate with any messages related to
12651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     (de)materializing the persistent variable.
12661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @return
12681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     True on success; false otherwise.
12691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1271427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterializeOneRegister (bool dematerialize,
1272427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              ExecutionContext &exe_ctx,
1273427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              RegisterContext &reg_ctx,
1274b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                              const RegisterInfo &reg_info,
1275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              lldb::addr_t addr,
1276427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              Error &err);
1277ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1278ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    //------------------------------------------------------------------
1279ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// A wrapper for ClangASTContext::CopyType that sets a flag that
1280ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// indicates that we should not respond to queries during import.
1281ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1282ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] dest_context
1283ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The target AST context, typically the parser's AST context.
1284ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1285ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] source_context
1286ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The source AST context, typically the AST context of whatever
1287ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     symbol file the type was found in.
1288ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1289ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] clang_type
1290ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The source type.
1291ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1292ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @return
1293ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The imported type.
1294ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    //------------------------------------------------------------------
1295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void *
1296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GuardedCopyType (clang::ASTContext *dest_context,
1297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     clang::ASTContext *source_context,
1298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     void *clang_type);
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionDeclMap_h_
1304