ClangExpressionDeclMap.h revision e3737fdca55be5c078534cc49fb38db409d12e32
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//----------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionDeclMap
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    //------------------------------------------------------------------
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Write to the target.
38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] addr
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address to write to.
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] data
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address of the data buffer to read from.
39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] length
39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The amount of data to write, in bytes.
39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the write could be performed; false otherwise.
39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
39947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    WriteTarget (lldb_private::Value &value,
40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                 const uint8_t *data,
40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                 size_t length);
40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Read from the target.
40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] data
40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address of the data buffer to write to.
40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] addr
41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The address to read from.
41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] length
41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The amount of data to read, in bytes.
41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the read could be performed; false otherwise.
41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ReadTarget (uint8_t *data,
42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                lldb_private::Value &value,
42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                size_t length);
42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Get the Value for a NamedDecl.
42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] decl
42747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The Decl whose value is to be found.
42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The value, or NULL.
43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    lldb_private::Value
43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    LookupDecl (clang::NamedDecl *decl);
43447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
43547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
43647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Returns true if the result is a
43747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///   reference to data in the target, meaning it must be
43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///   dereferenced once more to get its data.
43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
44047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
44147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name of the result.
44247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
44347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
44447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the result is a reference; false otherwise (or on
44547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     error).
44647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
44747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
44847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ResultIsReference (const ConstString &name);
44947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
45047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
45147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Find the result persistent variable,
45247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///   propagate the given value to it, and return it.
45347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
45447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[out] valobj
45547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     Set to the complete object.
45647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
45747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] value
45847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     A value indicating the location of the value's contents.
45947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
46047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
46147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name of the result.
46247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
46347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] type
46447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The type of the data.
46547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
466a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    /// @param[in] transient
467a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    ///     True if the data should be treated as disappearing after the
468a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    ///     expression completes.  In that case, it gets no live data.
469a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan    ///
47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True on success; false otherwise.
47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    bool
47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                            lldb_private::Value &value,
47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                            const ConstString &name,
477a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                            lldb_private::TypeFromParser type,
478a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                            bool transient);
47947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
48047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
481a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Materialize the entire struct
482a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// at a given address, which should be aligned as specified by
483a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// GetStructInfo().
484a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
485a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
486a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context at which to dump the struct.
487a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
488a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] struct_address
489a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which the struct should be written.
490a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
491a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
492a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
493a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     materializing the struct.
494a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
495a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
496a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
497a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
498427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    Materialize (ExecutionContext &exe_ctx,
500427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                 lldb::addr_t &struct_address,
501427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                 Error &error);
502f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
503a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
5043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// [Used by CommandObjectExpression] Get the "this" pointer
5053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// from a given execution context.
5063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[out] object_ptr
5083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The this pointer.
5093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    /// @param[in] object_name
5113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///     The name of the object pointer -- "this," "self," or similar
5123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///     depending on language
5133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ///
5143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] exe_ctx
5153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The execution context at which to dump the struct.
5163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
5173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] error
5183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     An Error to populate with any messages related to
5193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     finding the "this" pointer.
5203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
521047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    /// @param[in] suppress_type_check
522047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    ///     True if the type is not needed.
523047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    ///
5243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @return
5253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     True on success; false otherwise.
5263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetObjectPointer (lldb::addr_t &object_ptr,
529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      ConstString &object_name,
530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      ExecutionContext &exe_ctx,
531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      Error &error,
532427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      bool suppress_type_check = false);
5333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    //------------------------------------------------------------------
535a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Pretty-print a materialized
536a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct, which must have been materialized by Materialize(),
537a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// byte for byte on a given stream.
538a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
539a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
540a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
541a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
542a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] s
543a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The stream on which to write the pretty-printed output.
544a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
545a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
546a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
547a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     pretty-printing the struct.
548a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
549a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
550a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
551a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
552427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DumpMaterializedStruct (ExecutionContext &exe_ctx,
554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                            Stream &s,
555427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                            Error &error);
55632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
557a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
558a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by CommandObjectExpression] Deaterialize the entire struct.
559a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
560a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
561a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context from which to read the struct.
562a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
563a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
564a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ///     A ClangExpressionVariable containing the result of the
565a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     expression, for potential re-use.
566a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
5670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    /// @param[in] stack_frame_top, stack_frame_bottom
5680ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     If not LLDB_INVALID_ADDRESS, the bounds for the stack frame
5690ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     in which the expression ran.  A result whose address falls
5700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     inside this stack frame is dematerialized as a value
5710ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     requiring rematerialization.
5720ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///
573a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] error
574a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
575a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     dematerializing the struct.
576a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
577a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
578a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
579a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
581427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    Dematerialize (ExecutionContext &exe_ctx,
582427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   lldb::ClangExpressionVariableSP &result_sp,
5830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_top,
5840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_bottom,
585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   Error &error);
586810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
587a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
588a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
589a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// using a NameSearchContext to make Decls for them.
590a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
591a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
592a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
593a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
594a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
595a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
596a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
597a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
598a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     it can't access DeclarationName.
599a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
600a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
601a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
602a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
603427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
60416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    FindExternalVisibleDecls (NameSearchContext &context,
60516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                              const ConstString &name);
606aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
607aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
6089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// [Used by ClangASTSource] Find all Decls in a context that match
6099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// a given criterion.
610e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ///
611e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    /// @param[in] decl_context
6129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     The DeclContext to search.
613e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ///
6149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] predicate
6159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     Returns True if a DeclKind is desired; False if not.
6169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///
6179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] decls
6189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     A list to add all found Decls that have a desired DeclKind
6199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     into.
6209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    clang::ExternalLoadResult
6229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    FindExternalLexicalDecls (const clang::DeclContext *decl_context,
6239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                              bool (*predicate)(clang::Decl::Kind),
6249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                              llvm::SmallVectorImpl<clang::Decl*> &decls);
6259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
6269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// [Used by ClangASTSource] Complete the definition of a TagDecl.
6289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///
6299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] tag_decl
6309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     The TagDecl to be completed.
631e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    //------------------------------------------------------------------
6329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    void
6339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    CompleteTagDecl (clang::TagDecl *tag_decl);
6349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
6359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// [Used by ClangASTSource] Complete the definition of an
6379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// ObjCInterfaceDecl.
6389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///
6399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    /// @param[in] tag_decl
6409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ///     The ObjCInterfaceDecl to be completed.
6419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    //------------------------------------------------------------------
6429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    void
6439b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl);
644e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
645e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    //------------------------------------------------------------------
646aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// [Used by ClangASTSource] Report whether a $__lldb variable has
647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// been searched for yet.  This is the trigger for beginning to
648aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// actually look for externally-defined names.  (Names that come
649aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// before this are typically the names of built-ins that don't need
650aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// to be looked up.)
651aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ///
652aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// @return
653aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ///     True if a $__lldb variable has been found.
654aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
6558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool
656b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetLookupsEnabled () const
6578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
658aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        assert(m_parser_vars.get());
659aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        return m_parser_vars->m_enable_lookups;
6608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
661b01000fd063629facd45044f137446fb748ee179Greg Clayton
662b01000fd063629facd45044f137446fb748ee179Greg Clayton    bool
663b01000fd063629facd45044f137446fb748ee179Greg Clayton    GetImportInProgress () const
664b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
665b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (m_parser_vars.get())
666b01000fd063629facd45044f137446fb748ee179Greg Clayton            return m_parser_vars->m_ignore_lookups;
667b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
668b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
6698de27c761a22187ef63fb60000894be163e7285fGreg Clayton
670aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
671aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// [Used by ClangASTSource] Indicate that a $__lldb variable has
672aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// been found.
673aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
6748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    void
675aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    SetLookupsEnabled ()
6768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
677aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        assert(m_parser_vars.get());
678aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_enable_lookups = true;
6798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
6808de27c761a22187ef63fb60000894be163e7285fGreg Clayton
681a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callananprivate:
682427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableList    m_found_entities;           ///< All entities that were looked up for the parser.
683427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableList    m_struct_members;           ///< All entities that need to be placed in the struct.
6846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool                           m_keep_result_in_memory;    ///< True if result persistent variables generated by this expression should stay in memory.
685aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
686aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
687aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values should not live beyond parsing
688aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
689bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    class ParserVars
690bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
691bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    public:
692aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ParserVars() :
693aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_exe_ctx(NULL),
694aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_sym_ctx(),
695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_persistent_vars(NULL),
696aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_enable_lookups(false),
697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_ignore_lookups(false)
698aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
699aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
700aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
701427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *
702427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        GetTarget()
703427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
704567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (m_exe_ctx && m_exe_ctx->GetTargetPtr())
705567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                return m_exe_ctx->GetTargetPtr();
706427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            else if (m_sym_ctx.target_sp)
707427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                m_sym_ctx.target_sp.get();
708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return NULL;
709427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
710e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
711e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ClangASTImporter *GetASTImporter (clang::ASTContext *ast_context)
712e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
713e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            if (!m_ast_importer.get())
714e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                m_ast_importer.reset(new ClangASTImporter(ast_context));
715e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
716e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            if (m_ast_importer->TargetASTContext() != ast_context)
717e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                return NULL;
718e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
719e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return m_ast_importer.get();
720e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
721e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
722aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ExecutionContext           *m_exe_ctx;          ///< The execution context to use when parsing.
723aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        SymbolContext               m_sym_ctx;          ///< The symbol context to use in finding variables and types.
724aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ClangPersistentVariables   *m_persistent_vars;  ///< The persistent variables for the process.
725aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_enable_lookups;   ///< Set to true during parsing if we have found the first "$__lldb" name.
726aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_ignore_lookups;   ///< True during an import when we should be ignoring type lookups.
727e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        std::auto_ptr<ClangASTImporter> m_ast_importer; ///< The importer used to import types on the parser's behalf.
72847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TargetInfo                  m_target_info;      ///< Basic information about the target.
729bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    private:
730bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        DISALLOW_COPY_AND_ASSIGN (ParserVars);
731aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
732aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
733aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<ParserVars> m_parser_vars;
734aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
735aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
736aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate parser-specific variables
737aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
738427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableParserVars()
740aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
741aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_parser_vars.get())
742d7d3af7201c7aed2ddd0ade31ae5d3543994c55bStephen Wilson            m_parser_vars.reset(new ParserVars);
743aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
745aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
746aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate parser-specific variables
747aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
748427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
749427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableParserVars()
750aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
751aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars.reset();
752aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
753aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
754aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
755aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values contain layout information for the materialized
756aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// struct, but are not specific to a single materialization
757aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
758aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct StructVars {
759aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        StructVars() :
760aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_alignment(0),
761aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_size(0),
762aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_laid_out(false),
763aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_result_name(),
764aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_object_pointer_type(NULL, NULL)
765aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
766aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
767aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
768aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        off_t                       m_struct_alignment;         ///< The alignment of the struct in bytes.
769aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        size_t                      m_struct_size;              ///< The size of the struct in bytes.
770aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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).
771aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ConstString                 m_result_name;              ///< The name of the result variable ($1, for example)
772aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TypeFromUser                m_object_pointer_type;      ///< The type of the "this" variable, if one exists
773aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
774aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
775aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<StructVars> m_struct_vars;
776aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
777aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
778aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate struct variables
779aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
780427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
781427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableStructVars()
782aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
783aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_struct_vars.get())
784aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars.reset(new struct StructVars);
785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
786aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
787aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
788aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate struct variables
789aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
791427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableStructVars()
792aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
793aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_struct_vars.reset();
794aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
795aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
796aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
797aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values refer to a specific materialization of the
798aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// structure in a process
799aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
800aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct MaterialVars {
801aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        MaterialVars() :
8022bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen            m_allocated_area(0),
8032bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen            m_materialized_location(0)
804aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
805aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
806aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
807aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        Process                    *m_process;                  ///< The process that the struct is materialized into.
808aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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.
809aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t                m_materialized_location;    ///< The address at which the struct is placed.  Falls inside the allocated area.
810aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
811aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
812aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<MaterialVars> m_material_vars;
813aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
814aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
815aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate materialization-specific variables
816aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableMaterialVars()
819aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
820aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_material_vars.get())
821aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars.reset(new struct MaterialVars);
822aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
823aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
824aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
825aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate materialization-specific variables
826aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
827427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
828427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableMaterialVars()
829aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
830aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars.reset();
831aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
832aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
833a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
83416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
83516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// using a NameSearchContext to make Decls for them.
83616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
83716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @param[in] context
83816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
83916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
84016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @param[in] module
84116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     If non-NULL, the module to query.
84216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
84394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] namespace_decl
84494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If valid and module is non-NULL, the parent namespace.
84516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
84616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @param[in] name
84716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
84816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
84916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
85016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     it can't access DeclarationName.
85116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///
85267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    /// @param[in] current_id
85367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     The ID for the current FindExternalVisibleDecls invocation,
85467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     for logging purposes.
85567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///
85616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    /// @return
85716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    ///     True on success; false otherwise.
85816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    //------------------------------------------------------------------
85916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    void
86016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    FindExternalVisibleDecls (NameSearchContext &context,
86116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                              lldb::ModuleSP module,
86203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                              ClangNamespaceDecl &namespace_decl,
86367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                              const ConstString &name,
86467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                              unsigned int current_id);
86516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
86616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    //------------------------------------------------------------------
867cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// Given a stack frame, find a variable that matches the given name and
868cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// type.  We need this for expression re-use; we may not always get the
869cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// same lldb::Variable back, and we want the expression to work wherever
870cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// it can.  Returns the variable defined in the tightest scope.
871a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
872cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    /// @param[in] frame
873cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    ///     The stack frame to use as a basis for finding the variable.
874a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
875a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
876a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name as a plain C string.
877a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
878a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
879a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required type for the variable.  This function may be called
880a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
881a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     default.
882a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
883a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
884a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
885a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
886696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::VariableSP
887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    FindVariableInScope (StackFrame &frame,
888427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                         const ConstString &name,
889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                         TypeFromUser *type = NULL);
890336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
891a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
892819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// Given a target, find a data symbol that has the given name.
893819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
894819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] target
895819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The target to use as the basis for the search.
896819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
897819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] name
898819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The name as a plain C string.
899819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
900819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @return
901819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The LLDB Symbol found, or NULL if none was found.
902819749647b1605f75753f625050cb240292c08b0Sean Callanan    //---------------------------------------------------------
903819749647b1605f75753f625050cb240292c08b0Sean Callanan    Symbol *
904819749647b1605f75753f625050cb240292c08b0Sean Callanan    FindGlobalDataSymbol (Target &target,
905aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                          const ConstString &name);
906819749647b1605f75753f625050cb240292c08b0Sean Callanan
907819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// Given a target, find a variable that matches the given name and
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// type.
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] target
91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The target to use as a basis for finding the variable.
91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
91494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] module
91594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If non-NULL, the module to search.
91694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name as a plain C string.
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
92094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] namespace_decl
92194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If non-NULL and module is non-NULL, the parent namespace.
92294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] type
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The required type for the variable.  This function may be called
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     default.
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    lldb::VariableSP
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    FindGlobalVariable (Target &target,
93394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        lldb::ModuleSP &module,
93494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        const ConstString &name,
93594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        ClangNamespaceDecl *namespace_decl,
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        TypeFromUser *type = NULL);
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
939a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Get the value of a variable in a given execution context and return
940a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// the associated Types if needed.
941a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
942a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
943a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to look for the variable in.
944a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
945a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
946a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The variable to evaluate.
947a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
948a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] parser_ast_context
949a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The AST context of the parser, to store the found type in.
950a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
951a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] found_type
952a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was found in the user process.
953a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     This is only useful when the variable is being inspected on behalf
954a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of the parser, hence the default.
955a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
956a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] parser_type
957a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was copied into the parser's
958a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     AST context.  This is only useful when the variable is being
959a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     inspected on behalf of the parser, hence the default.
960a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
961a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
962a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Decl to be looked up.
963a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
964a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
965a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Value for the variable.
966a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
967427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    Value *
968427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetVariableValue (ExecutionContext &exe_ctx,
9694a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan                      lldb::VariableSP &var,
970427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      clang::ASTContext *parser_ast_context,
971427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      TypeFromUser *found_type = NULL,
972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      TypeFromParser *parser_type = NULL);
973336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
974a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
975a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
976a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Variable, and put it in the Tuple list.
977a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
978a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
979a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
980a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
981a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
982a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable that needs a Decl.
983a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
984427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
985427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneVariable (NameSearchContext &context,
98667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    lldb::VariableSP var,
98767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
988a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
989a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
990a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
991819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// persistent variable, and put it in the list of found entities.
992a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
993a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
994a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
995a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
996a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] pvar
997a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The persistent variable that needs a Decl.
99867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///
99967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    /// @param[in] current_id
100067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     The ID of the current invocation of FindExternalVisibleDecls
100167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     for logging purposes.
1002a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1003427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1004427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneVariable (NameSearchContext &context,
100567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    lldb::ClangExpressionVariableSP &pvar_sp,
100667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
1007a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1008a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1009819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
1010819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// symbol (treated as a variable), and put it in the list of found
1011819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// entities.
1012819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
1013819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] context
1014819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1015819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
1016819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] var
1017819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The LLDB Variable that needs a Decl.
1018819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
1019819749647b1605f75753f625050cb240292c08b0Sean Callanan    void
1020819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddOneGenericVariable (NameSearchContext &context,
102167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                           Symbol &symbol,
102267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                           unsigned int current_id);
1023819749647b1605f75753f625050cb240292c08b0Sean Callanan
1024819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
1025a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
1026a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// function.  (Functions are not placed in the Tuple list.)  Can
1027a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// handle both fully typed functions and generic functions.
1028a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1029a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
1030a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1031a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1032a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] fun
1033a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Function that needs to be created.  If non-NULL, this is
1034a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a fully-typed function.
1035a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1036a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym
1037a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Symbol that corresponds to a function that needs to be
1038a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     created with generic type (unitptr_t foo(...)).
1039a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1041427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneFunction (NameSearchContext &context,
1042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    Function *fun,
104367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    Symbol *sym,
104467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
1045a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
1046a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1047a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
10481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register.
10491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
10501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] context
10511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
10521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
10531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
10541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information corresponding to that register.
10551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
1056427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1057427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneRegister (NameSearchContext &context,
105867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    const RegisterInfo *reg_info,
105967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
10601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
10621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
1063a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// type.  (Types are not placed in the Tuple list.)
1064a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1065a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
1066a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
1067a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1068a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
10693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The type that needs to be created.
10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///
10713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    /// @param[in] add_method
10728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     True if a method with signature void $__lldb_expr(void*)
10733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     should be added to the C++ class type passed in
1074a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1075427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1076427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneType (NameSearchContext &context,
107767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                TypeFromUser &type,
107867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                unsigned int current_id,
1079e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                bool add_method);
1080810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1081a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1082a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing the struct.
1083a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Since both tasks are very similar, although ClangExpressionDeclMap
1084a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// exposes two functions to the outside, both call DoMaterialize.
1085a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1086a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
1087a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the struct is to be dematerialized; false if it is to
1088a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
1089a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1090a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
1091a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
1092a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
10930ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    /// @param[in] stack_frame_top, stack_frame_bottom
10940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     If not LLDB_INVALID_ADDRESS, the bounds for the stack frame
10950ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     in which the expression ran.  A result whose address falls
10960ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     inside this stack frame is dematerialized as a value
10970ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     requiring rematerialization.
10980ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///
1099a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] result
1100a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     If the struct is being dematerialized, a pointer into which the
1101a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     location of the result persistent variable is placed.  If not,
1102a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     NULL.
1103a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1104a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
1105a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
1106a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the struct.
1107a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1108a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1109a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
1110a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterialize (bool dematerialize,
1113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   ExecutionContext &exe_ctx,
11140ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_top,
11150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                   lldb::addr_t stack_frame_bottom,
1116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   lldb::ClangExpressionVariableSP *result_sp_ptr,
1117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   Error &err);
1118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
1120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Clean up the state required to dematerialize the variable.
1121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
1122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
1123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DidDematerialize ();
1124f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1125a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1126a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a persistent
1127a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
1128a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1129a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
1130a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
1131a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
1132a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1133a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
1134a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
1135a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    /// @param[in] var_sp
1137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ///     The persistent variable to materialize
1138a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1139a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
1140a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
1141a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
11420ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    /// @param[in] stack_frame_top, stack_frame_bottom
11430ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     If not LLDB_INVALID_ADDRESS, the bounds for the stack frame
11440ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     in which the expression ran.  A result whose address falls
11450ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     inside this stack frame is dematerialized as a value
11460ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///     requiring rematerialization.
11470ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    ///
1148a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
1149a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
1150a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
1151a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1152a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1153a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
1154a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1155427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1156427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterializeOnePersistentVariable (bool dematerialize,
1157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        ExecutionContext &exe_ctx,
1158427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        lldb::ClangExpressionVariableSP &var_sp,
1159427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        lldb::addr_t addr,
11600ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                        lldb::addr_t stack_frame_top,
11610ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                        lldb::addr_t stack_frame_bottom,
1162427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        Error &err);
1163a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1164a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1165a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Actually do the task of materializing or dematerializing a
1166a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// variable.
1167a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1168a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] dematerialize
1169a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
1170a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized.
1171a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1172a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
1173a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use.
1174a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1175a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym_ctx
1176a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The symbol context to use (for looking the variable up).
1177a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    /// @param[in] expr_var
11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     The entity that the expression parser uses for the variable.
11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     In case the variable needs to be copied into the target's
11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     memory, this location is stored in the variable during
11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     materialization and cleared when it is demateralized.
1183a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1184a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] addr
1185a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The address at which to materialize the variable.
1186a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1187a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] err
1188a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     An Error to populate with any messages related to
1189a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     (de)materializing the persistent variable.
1190a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1191a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
1192a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
1193a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
1194427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterializeOneVariable (bool dematerialize,
1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              ExecutionContext &exe_ctx,
1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              const SymbolContext &sym_ctx,
11986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                              lldb::ClangExpressionVariableSP &expr_var,
1199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              lldb::addr_t addr,
1200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              Error &err);
12011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
12021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
12031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Actually do the task of materializing or dematerializing a
12041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register variable.
12051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] dematerialize
12071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     True if the variable is to be dematerialized; false if it is to
12081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     be materialized.
12091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] exe_ctx
12111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The execution context to use.
12121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_ctx
12141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The register context to use.
12151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
12171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information for the register to read/write.
12181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] addr
12201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The address at which to materialize the variable.
12211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] err
12231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     An Error to populate with any messages related to
12241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     (de)materializing the persistent variable.
12251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
12261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @return
12271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     True on success; false otherwise.
12281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
1229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoMaterializeOneRegister (bool dematerialize,
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              ExecutionContext &exe_ctx,
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              RegisterContext &reg_ctx,
1233b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                              const RegisterInfo &reg_info,
1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              lldb::addr_t addr,
1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                              Error &err);
1236ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1237ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    //------------------------------------------------------------------
1238ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// A wrapper for ClangASTContext::CopyType that sets a flag that
1239ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// indicates that we should not respond to queries during import.
1240ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1241ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] dest_context
1242ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The target AST context, typically the parser's AST context.
1243ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1244ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] source_context
1245ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The source AST context, typically the AST context of whatever
1246ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     symbol file the type was found in.
1247ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1248ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @param[in] clang_type
1249ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The source type.
1250ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///
1251ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    /// @return
1252ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    ///     The imported type.
1253ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    //------------------------------------------------------------------
1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void *
1255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GuardedCopyType (clang::ASTContext *dest_context,
1256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     clang::ASTContext *source_context,
1257427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     void *clang_type);
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionDeclMap_h_
1263