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