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