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"
28f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan#include "lldb/Expression/ClangASTSource.h"
29a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Expression/ClangExpressionVariable.h"
30a6686e36cd56843e594139324884585fb47b918bSean Callanan#include "lldb/Expression/Materializer.h"
31841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan#include "lldb/Symbol/TaggedASTType.h"
328de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Symbol/SymbolContext.h"
338de27c761a22187ef63fb60000894be163e7285fGreg Clayton#include "lldb/Target/ExecutionContext.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan//----------------------------------------------------------------------
38a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// @class ClangExpressionDeclMap ClangExpressionDeclMap.h "lldb/Expression/ClangExpressionDeclMap.h"
39a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// @brief Manages named entities that are defined in LLDB's debug information.
40a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
41a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// The Clang parser uses the ClangASTSource as an interface to request named
42a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// entities from outside an expression.  The ClangASTSource reports back, listing
43a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// all possible objects corresponding to a particular name.  But it in turn
44a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// relies on ClangExpressionDeclMap, which performs several important functions.
45a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
46a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// First, it records what variables and functions were looked up and what Decls
47a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// were returned for them.
48a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
49a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Second, it constructs a struct on behalf of IRForTarget, recording which
50a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// variables should be placed where and relaying this information back so that
51a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// IRForTarget can generate context-independent code.
52a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
53a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Third, it "materializes" this struct on behalf of the expression command,
54a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// finding the current values of each variable and placing them into the
55a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// struct so that it can be passed to the JITted version of the IR.
56a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan///
57a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// Fourth and finally, it "dematerializes" the struct after the JITted code has
58a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan/// has executed, placing the new values back where it found the old ones.
59a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan//----------------------------------------------------------------------
60f76afff22617c3f632af58ffebe1f037ba935717Sean Callananclass ClangExpressionDeclMap :
6173b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    public ClangASTSource
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
64a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
65a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Constructor
66a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    /// Initializes class variables.
686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///
696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    /// @param[in] keep_result_in_memory
706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     If true, inhibits the normal deallocation of the memory for
716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     the result persistent variable, and instead marks the variable
726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ///     as persisting.
733b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    ///
743b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    /// @param[in] exe_ctx
753b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    ///     The execution context to use when parsing.
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
7773b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    ClangExpressionDeclMap (bool keep_result_in_memory,
7873b520f4f60dca58e58e446c9504d45384ee677bSean Callanan                            ExecutionContext &exe_ctx);
79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
80aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Destructor
82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
83427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ~ClangExpressionDeclMap ();
84aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //------------------------------------------------------------------
86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Enable the state needed for parsing and IR transformation.
87a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
88a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] exe_ctx
89a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The execution context to use when finding types for variables.
90a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     Also used to find a "scratch" AST context to store result types.
91166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    ///
923b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    /// @param[in] materializer
933b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    ///     If non-NULL, the materializer to populate with information about
943b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    ///     the variables to use
953b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    ///
96166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    /// @return
97166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    ///     True if parsing is possible; false if it is unsafe to continue.
98a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
99166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    bool
1003b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    WillParse (ExecutionContext &exe_ctx,
1013b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan               Materializer *materializer);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
104fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    /// [Used by ClangExpressionParser] For each variable that had an unknown
105fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ///     type at the beginning of parsing, determine its final type now.
106fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ///
107fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    /// @return
108fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ///     True on success; false otherwise.
109fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //------------------------------------------------------------------
110fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    bool
111fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    ResolveUnknownTypes();
112fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
113fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //------------------------------------------------------------------
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Disable the state needed for parsing and IR transformation.
115a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DidParse ();
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
120a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the list of persistent
121a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     variables for the process.
122a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
1238c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] decl
1248c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The Clang declaration for the persistent variable, used for
1258c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     lookup during parsing.
1268c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///
127a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
128a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the persistent variable, usually $something.
129a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
130a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
131a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the variable, in the Clang parser's context.
132a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
133a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
134a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
135a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddPersistentVariable (const clang::NamedDecl *decl,
138427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                           const ConstString &name,
1396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                           TypeFromParser type,
1406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                           bool is_result,
1416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                           bool is_lvalue);
142a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
143a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
144a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Add a variable to the struct that needs to
145a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     be materialized each time the expression runs.
146a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
147a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
148a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Clang declaration for the variable.
149a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
15045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[in] name
15145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the variable.
15245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
1538c12720c108cd5e7ed792596749218d8400f647eSean Callanan    /// @param[in] value
1548c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ///     The LLVM IR value for this variable.
155a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
156a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] size
157a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the variable in bytes.
158a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
159a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] alignment
160a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The required alignment of the variable in bytes.
161a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
162a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
163a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
164a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
165427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddValueToStruct (const clang::NamedDecl *decl,
167427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      const ConstString &name,
168427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      llvm::Value *value,
169427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      size_t size,
170427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      off_t alignment);
171a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
172a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
173a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Finalize the struct, laying out the position
174a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of each object in it.
175a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
176a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
177a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
178a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DoStructLayout ();
181a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
182a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
183a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get general information about the laid-out
184a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// struct after DoStructLayout() has been called.
185a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
186a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] num_elements
187a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The number of elements in the struct.
188a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
189a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] size
190a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The size of the struct, in bytes.
191a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
192a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] alignment
193a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The alignment of the struct, in bytes.
194a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
195a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
196a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
197a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetStructInfo (uint32_t &num_elements,
200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   size_t &size,
201427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                   off_t &alignment);
202a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
203a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
204a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get specific information about one field
205a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// of the laid-out struct after DoStructLayout() has been called.
206a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
207a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] decl
208a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the field, as generated by ClangASTSource
209a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.  In the case of the result
2108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ///     value, this will have the name $__lldb_result even if the
211a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     result value ends up having the name $1.  This is an
212a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     implementation detail of IRForTarget.
213a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
214a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] value
215a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The IR value for the field (usually a GlobalVariable).  In
216a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     the case of the result value, this will have the correct
217a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     name ($1, for instance).  This is an implementation detail
218a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of IRForTarget.
219a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
220a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] offset
221a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The offset of the field from the beginning of the struct.
222a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     As long as the struct is aligned according to its required
223a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     alignment, this offset will align the field correctly.
224a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
22545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    /// @param[out] name
22645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///     The name of the field as used in materialization.
22745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    ///
228a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] index
229a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The index of the field about which information is requested.
230a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
231a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
232a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
233a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetStructElement (const clang::NamedDecl *&decl,
236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      llvm::Value *&value,
237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      off_t &offset,
238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      ConstString &name,
239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      uint32_t index);
2408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
241a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
242a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get information about a function given its
243a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Decl.
244a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
245a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
246a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The parsed Decl for the Function, as generated by ClangASTSource
247a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     on ClangExpressionDeclMap's behalf.
248a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
249a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
250a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
251a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
252a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
253a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the information could be retrieved; false otherwise.
254a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetFunctionInfo (const clang::NamedDecl *decl,
257427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                     uint64_t &ptr);
258a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
259a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
260a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by IRForTarget] Get the address of a function given nothing
261a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// but its name.  Some functions are needed but didn't get Decls made
262a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// during parsing -- specifically, sel_registerName is never called
263a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// in the generated IR but we need to call it nonetheless.
264a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
265a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] name
266a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The name of the function.
267a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
268a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] ptr
269a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The absolute address of the function in the target.
270a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
271a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
272a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True if the address could be retrieved; false otherwise.
273a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
274427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    bool
275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    GetFunctionAddress (const ConstString &name,
276427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        uint64_t &ptr);
277f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
278a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
279c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// [Used by IRForTarget] Get the address of a symbol given nothing
280c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// but its name.
281c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    ///
282819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] target
283819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The target to find the symbol in.  If not provided,
284819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     then the current parsing context's Target.
285819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
286d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    /// @param[in] process
287d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    ///     The process to use.  For Objective-C symbols, the process's
288d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    ///     Objective-C language runtime may be queried if the process
289d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    ///     is non-NULL.
290d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    ///
291c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// @param[in] name
292c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    ///     The name of the symbol.
293c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    ///
294c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    /// @return
295cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    ///     Valid load address for the symbol
296c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    //------------------------------------------------------------------
297cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    lldb::addr_t
298819749647b1605f75753f625050cb240292c08b0Sean Callanan    GetSymbolAddress (Target &target,
299d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan                      Process *process,
30021ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan                      const ConstString &name,
30121ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan                      lldb::SymbolType symbol_type);
302819749647b1605f75753f625050cb240292c08b0Sean Callanan
303cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    lldb::addr_t
30421ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    GetSymbolAddress (const ConstString &name,
30521ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan                      lldb::SymbolType symbol_type);
306c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
307c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    //------------------------------------------------------------------
30847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// [Used by IRInterpreter] Get basic target information.
30947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
31047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[out] byte_order
31147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The byte order of the target.
31247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
31347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[out] address_byte_size
31447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The size of a pointer in bytes.
31547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
31647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
31747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     True if the information could be determined; false
31847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     otherwise.
31947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
32047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    struct TargetInfo
32147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
32247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb::ByteOrder byte_order;
32347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        size_t address_byte_size;
32447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
32547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TargetInfo() :
32647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            byte_order(lldb::eByteOrderInvalid),
32747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            address_byte_size(0)
32847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
32947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
33047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
33147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        bool IsValid()
33247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
33347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return (byte_order != lldb::eByteOrderInvalid &&
33447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    address_byte_size != 0);
33547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
33647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    };
33747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo GetTargetInfo();
33847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
33947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
340a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// [Used by ClangASTSource] Find all entities matching a given name,
341a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// using a NameSearchContext to make Decls for them.
342a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
343a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
344a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
345a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
346a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
347a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     True on success; false otherwise.
348a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
349427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
350f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    FindExternalVisibleDecls (NameSearchContext &context);
3519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
3529394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    //------------------------------------------------------------------
3539394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// Find all entities matching a given name in a given module/namespace,
3549394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// using a NameSearchContext to make Decls for them.
3559394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///
3569394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// @param[in] context
3579394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     The NameSearchContext that can construct Decls for this name.
3589394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///
3599394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// @param[in] module
3609394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     If non-NULL, the module to query.
3619394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///
3629394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// @param[in] namespace_decl
3639394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     If valid and module is non-NULL, the parent namespace.
3649394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///
3659394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// @param[in] name
3669394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     The name as a plain C string.  The NameSearchContext contains
3679394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     a DeclarationName for the name so at first the name may seem
3689394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     redundant, but ClangExpressionDeclMap operates in RTTI land so
3699394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     it can't access DeclarationName.
3709394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///
3719394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// @param[in] current_id
3729394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     The ID for the current FindExternalVisibleDecls invocation,
3739394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     for logging purposes.
3749394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///
3759394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    /// @return
3769394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    ///     True on success; false otherwise.
3779394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    //------------------------------------------------------------------
3789394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    void
3799394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    FindExternalVisibleDecls (NameSearchContext &context,
3809394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                              lldb::ModuleSP module,
3819394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                              ClangNamespaceDecl &namespace_decl,
3829394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                              unsigned int current_id);
383a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callananprivate:
384427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableList    m_found_entities;           ///< All entities that were looked up for the parser.
385427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableList    m_struct_members;           ///< All entities that need to be placed in the struct.
3866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool                           m_keep_result_in_memory;    ///< True if result persistent variables generated by this expression should stay in memory.
387aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
388aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values should not live beyond parsing
390aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
391bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    class ParserVars
392bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    {
393bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    public:
394a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        ParserVars(ClangExpressionDeclMap &decl_map) :
395dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            m_exe_ctx(),
396aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_sym_ctx(),
397aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_persistent_vars(NULL),
39897c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar            m_enable_lookups(false),
3993b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan            m_materializer(NULL),
40097c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar            m_decl_map(decl_map)
401aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
402aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
403aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *
405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        GetTarget()
406427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
407dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            if (m_exe_ctx.GetTargetPtr())
408dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                return m_exe_ctx.GetTargetPtr();
409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            else if (m_sym_ctx.target_sp)
410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                m_sym_ctx.target_sp.get();
411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return NULL;
412427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
413e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
414dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ExecutionContext            m_exe_ctx;          ///< The execution context to use when parsing.
415aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        SymbolContext               m_sym_ctx;          ///< The symbol context to use in finding variables and types.
416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ClangPersistentVariables   *m_persistent_vars;  ///< The persistent variables for the process.
417aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        bool                        m_enable_lookups;   ///< Set to true during parsing if we have found the first "$__lldb" name.
41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TargetInfo                  m_target_info;      ///< Basic information about the target.
4193b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan        Materializer               *m_materializer;     ///< If non-NULL, the materializer to use when reporting used variables.
420bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    private:
421a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        ClangExpressionDeclMap     &m_decl_map;
422bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton        DISALLOW_COPY_AND_ASSIGN (ParserVars);
423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
424aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
425102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<ParserVars> m_parser_vars;
426aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
427aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
428aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate parser-specific variables
429aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
431427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableParserVars()
432aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_parser_vars.get())
434a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            m_parser_vars.reset(new ParserVars(*this));
435aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
436aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
437aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
438aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate parser-specific variables
439aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
440427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
441427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableParserVars()
442aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
443aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars.reset();
444aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
445aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
446aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
447aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// The following values contain layout information for the materialized
448aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// struct, but are not specific to a single materialization
449aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    struct StructVars {
451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        StructVars() :
452aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_alignment(0),
453aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_size(0),
454aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_laid_out(false),
455aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_result_name(),
456aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_object_pointer_type(NULL, NULL)
457aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
458aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
459aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        off_t                       m_struct_alignment;         ///< The alignment of the struct in bytes.
461aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        size_t                      m_struct_size;              ///< The size of the struct in bytes.
462aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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).
463aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ConstString                 m_result_name;              ///< The name of the result variable ($1, for example)
464aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TypeFromUser                m_object_pointer_type;      ///< The type of the "this" variable, if one exists
465aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    };
466aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
467102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<StructVars> m_struct_vars;
468aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
469aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Activate struct variables
471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
472427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
473427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    EnableStructVars()
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (!m_struct_vars.get())
476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars.reset(new struct StructVars);
477aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
479aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
480aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    /// Deallocate struct variables
481aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
482427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    DisableStructVars()
484aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
485aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_struct_vars.reset();
486aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
487aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
488aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    //----------------------------------------------------------------------
48931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    /// Get this parser's ID for use in extracting parser- and JIT-specific
49031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    /// data from persistent variables.
49131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    //----------------------------------------------------------------------
49231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    uint64_t
49331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    GetParserID()
49431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    {
49531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        return (uint64_t)this;
49631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    }
49731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
498a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
499819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// Given a target, find a data symbol that has the given name.
500819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
501819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] target
502819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The target to use as the basis for the search.
503819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
504819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] name
505819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The name as a plain C string.
506819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
507819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @return
508819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The LLDB Symbol found, or NULL if none was found.
509819749647b1605f75753f625050cb240292c08b0Sean Callanan    //---------------------------------------------------------
51001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    const Symbol *
511819749647b1605f75753f625050cb240292c08b0Sean Callanan    FindGlobalDataSymbol (Target &target,
512aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                          const ConstString &name);
513819749647b1605f75753f625050cb240292c08b0Sean Callanan
514819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
51547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// Given a target, find a variable that matches the given name and
51647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// type.
51747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
51847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] target
51947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The target to use as a basis for finding the variable.
52047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
52194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] module
52294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If non-NULL, the module to search.
52394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///
52447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] name
52547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The name as a plain C string.
52647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
52794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    /// @param[in] namespace_decl
52894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///     If non-NULL and module is non-NULL, the parent namespace.
52994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ///
53047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @param[in] type
53147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The required type for the variable.  This function may be called
53247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     during parsing, in which case we don't know its type; hence the
53347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     default.
53447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///
53547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    /// @return
53647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ///     The LLDB Variable found, or NULL if none was found.
53747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
53847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    lldb::VariableSP
53947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    FindGlobalVariable (Target &target,
54094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        lldb::ModuleSP &module,
54194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        const ConstString &name,
54294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                        ClangNamespaceDecl *namespace_decl,
54347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        TypeFromUser *type = NULL);
54447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
54547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    //------------------------------------------------------------------
546a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Get the value of a variable in a given execution context and return
547a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// the associated Types if needed.
548a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
549a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
550a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The variable to evaluate.
551a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
55252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    /// @param[out] var_location
55352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ///     The variable location value to fill in
554a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
555a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] found_type
556a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was found in the user process.
557a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     This is only useful when the variable is being inspected on behalf
558a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     of the parser, hence the default.
559a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
560a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[out] parser_type
561a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The type of the found value, as it was copied into the parser's
562a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     AST context.  This is only useful when the variable is being
563a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     inspected on behalf of the parser, hence the default.
564a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
565a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] decl
566a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Decl to be looked up.
567a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
568a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @return
56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ///     Return true if the value was successfully filled in.
570a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
57152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
572dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    GetVariableValue (lldb::VariableSP &var,
57352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                      lldb_private::Value &var_location,
574427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      TypeFromUser *found_type = NULL,
575427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                      TypeFromParser *parser_type = NULL);
576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
577a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
578a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
579a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Variable, and put it in the Tuple list.
580a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
581a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
582a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
583a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
584a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] var
585a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The LLDB Variable that needs a Decl.
58689e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    ///
58789e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    /// @param[in] valobj
58889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    ///     The LLDB ValueObject for that variable.
589a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneVariable (NameSearchContext &context,
59267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    lldb::VariableSP var,
59389e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                    lldb::ValueObjectSP valobj,
59467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
595a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
596a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
597a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
598819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// persistent variable, and put it in the list of found entities.
599a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
600a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
601a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
602a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
603a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] pvar
604a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The persistent variable that needs a Decl.
60567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///
60667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    /// @param[in] current_id
60767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     The ID of the current invocation of FindExternalVisibleDecls
60867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    ///     for logging purposes.
609a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
610427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
611427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneVariable (NameSearchContext &context,
61267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    lldb::ClangExpressionVariableSP &pvar_sp,
61367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
614a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
615a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
616819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given LLDB
617819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// symbol (treated as a variable), and put it in the list of found
618819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// entities.
619819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
620819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] context
621819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
622819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///
623819749647b1605f75753f625050cb240292c08b0Sean Callanan    /// @param[in] var
624819749647b1605f75753f625050cb240292c08b0Sean Callanan    ///     The LLDB Variable that needs a Decl.
625819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
626819749647b1605f75753f625050cb240292c08b0Sean Callanan    void
627819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddOneGenericVariable (NameSearchContext &context,
62801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                           const Symbol &symbol,
62967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                           unsigned int current_id);
630819749647b1605f75753f625050cb240292c08b0Sean Callanan
631819749647b1605f75753f625050cb240292c08b0Sean Callanan    //------------------------------------------------------------------
632a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
633a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// function.  (Functions are not placed in the Tuple list.)  Can
634a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// handle both fully typed functions and generic functions.
635a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
636a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
637a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
638a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
639a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] fun
640a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Function that needs to be created.  If non-NULL, this is
641a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     a fully-typed function.
642a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
643a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] sym
644a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The Symbol that corresponds to a function that needs to be
645a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     created with generic type (unitptr_t foo(...)).
646a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneFunction (NameSearchContext &context,
649427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    Function *fun,
65067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    Symbol *sym,
65167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
652a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan
653a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
654a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
6551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// register.
6561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
6571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] context
6581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
6591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///
6601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// @param[in] reg_info
6611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ///     The information corresponding to that register.
6621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
663427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
664427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneRegister (NameSearchContext &context,
66567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    const RegisterInfo *reg_info,
66667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    unsigned int current_id);
6671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
6681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    //------------------------------------------------------------------
6691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    /// Use the NameSearchContext to generate a Decl for the given
670a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// type.  (Types are not placed in the Tuple list.)
671a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
672a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] context
673a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///     The NameSearchContext to use when constructing the Decl.
674a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    ///
675a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    /// @param[in] type
6763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ///     The type that needs to be created.
677a386e05ea6d20cdcedc80c23cf771d5030db43d6Sean Callanan    //------------------------------------------------------------------
678427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    void
679427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    AddOneType (NameSearchContext &context,
68067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                TypeFromUser &type,
681dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                unsigned int current_id);
682dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
683dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    //------------------------------------------------------------------
684dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    /// Copy a C++ class type into the parser's AST context and add a
685dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    /// member function declaration to it for the expression.
686dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    ///
687dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    /// @param[in] type
688dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    ///     The type that needs to be created.
689dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    //------------------------------------------------------------------
690dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
691dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    TypeFromParser
692dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    CopyClassType(TypeFromUser &type,
693dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                  unsigned int current_id);
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionDeclMap_h_
699