ClangExpressionVariable.h revision 8194e42fa9e0fe204ebadb2368eb486054d66bd3
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionVariable.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_ClangExpressionVariable_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ClangExpressionVariable_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <signal.h> 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdint.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 18a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include <string> 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector> 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h" 24a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan#include "lldb/Symbol/TaggedASTType.h" 25a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 26a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanannamespace llvm { 27a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan class Value; 28a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan} 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 318194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 328194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callananclass ClangExpressionVariableStore; 33a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass DataBufferHeap; 34a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass ExecutionContext; 35a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass Stream; 36a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass Value; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 384a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan//---------------------------------------------------------------------- 39a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariable ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h" 40a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief Encapsulates one variable for the expression parser. 41a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 42a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// The expression parser uses variables in three different contexts: 43a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 44a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// First, it stores persistent variables along with the process for use 45a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// in expressions. These persistent variables contain their own data 46a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// and are typed. 474a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan/// 48a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// Second, in an interpreted expression, it stores the local variables 49a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// for the expression along with the expression. These variables 50a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// contain their own data and are typed. 51a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 52a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// Third, in a JIT-compiled expression, it stores the variables that 53a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// the expression needs to have materialized and dematerialized at each 54a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// execution. These do not contain their own data but are named and 55a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// typed. 56a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 57a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// This class supports all of these use cases using simple type 58a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// polymorphism, and provides necessary support methods. Its interface 59a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// is RTTI-neutral. 604a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan//---------------------------------------------------------------------- 61a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananstruct ClangExpressionVariable 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable(); 64a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 65a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable(const ClangExpressionVariable &cev); 66a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 674a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 68a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// If the variable contains its own data, make a Value point at it 69a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// 70a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] value 71a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The value to point at the data. 72a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// 73a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @return 74a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// True on success; false otherwise (in particular, if this variable 75a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// does not contain its own data). 764a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 77a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan bool 78a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan PointValueAtData(Value &value); 794a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan 804a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 81a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The following values should stay valid for the life of the variable 824a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 83a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan std::string m_name; ///< The name of the variable 84a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan TypeFromUser m_user_type; ///< The type of the variable according to some LLDB context; NULL if the type hasn't yet been migrated to one 85a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 86a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 878194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan /// The following values indicate where the variable originally came from 888194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan //---------------------------------------------------------------------- 898194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan ClangExpressionVariableStore *m_store; ///< The store containing the variable 908194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan uint64_t m_index; ///< The index of the variable in the store 918194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 928194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan //---------------------------------------------------------------------- 93a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The following values should not live beyond parsing 94a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 95a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan struct ParserVars { 96a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan TypeFromParser m_parser_type; ///< The type of the variable according to the parser 97a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan const clang::NamedDecl *m_named_decl; ///< The Decl corresponding to this variable 98a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan llvm::Value *m_llvm_value; ///< The IR value corresponding to this variable; usually a GlobalValue 998c12720c108cd5e7ed792596749218d8400f647eSean Callanan lldb_private::Value *m_lldb_value; ///< The value found in LLDB for this variable 100a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan }; 101a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan std::auto_ptr<ParserVars> m_parser_vars; 102a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 103a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 104a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Make this variable usable by the parser by allocating space for 105a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// parser-specific variables 106a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 107a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan void EnableParserVars() 108a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 109a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan if (!m_parser_vars.get()) 110a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan m_parser_vars.reset(new struct ParserVars); 111a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 112a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 113a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 114a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Deallocate parser-specific variables 115a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 116a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan void DisableParserVars() 117a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 118a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan m_parser_vars.reset(); 119a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 120a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 121a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 122a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The following values are valid if the variable is used by JIT code 123a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 124a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan struct JITVars { 125a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan off_t m_alignment; ///< The required alignment of the variable, in bytes 126a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan size_t m_size; ///< The space required for the variable, in bytes 127a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan off_t m_offset; ///< The offset of the variable in the struct, in bytes 128a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan }; 129a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan std::auto_ptr<JITVars> m_jit_vars; 130a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 131a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 132a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Make this variable usable for materializing for the JIT by allocating 133a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// space for JIT-specific variables 134a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 135a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan void EnableJITVars() 136a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 137a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan if (!m_jit_vars.get()) 138a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan m_jit_vars.reset(new struct JITVars); 139a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 140a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 141a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 142a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Deallocate JIT-specific variables 143a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 144a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan void DisableJITVars() 145a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 146a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan m_jit_vars.reset(); 147a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 148a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 149a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 150a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The following values are valid if the value contains its own data 151a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 152a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan struct DataVars { 153a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan lldb_private::DataBufferHeap *m_data; ///< The heap area allocated to contain this variable's data. Responsibility for deleting this falls to whoever uses the variable last 154a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan }; 155a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan std::auto_ptr<DataVars> m_data_vars; 156a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 157a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 158a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Make this variable usable for storing its data internally by 159a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// allocating data-specific variables 160a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 161a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan void EnableDataVars() 162a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 163a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan if (!m_jit_vars.get()) 164a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan m_data_vars.reset(new struct DataVars); 165a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 166a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 167a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 168a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Deallocate data-specific variables 169a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 170a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan void DisableDataVars(); 171a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 172a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 173a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Return the variable's size in bytes 174a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 175a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan size_t Size () 176a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 177a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return (m_user_type.GetClangTypeBitWidth () + 7) / 8; 178a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 179a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1804a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 181a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Pretty-print the variable, assuming it contains its own data 1824a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// 183a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] output_stream 184a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The stream to pretty-print on. 1854a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// 186a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] exe_ctx 187a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The execution context to use when resolving the contents of the 188a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// variable. 1894a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// 190a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] format 191a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The format to print the variable in 192a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// 193a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] show_types 194a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// If true, print the type of the variable 195a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// 196a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] show_summary 197a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// If true, print a summary of the variable's type 198a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// 199a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] verbose 200a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// If true, be verbose in printing the value of the variable 2014a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// 2024a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// @return 203a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// An Error describing the result of the operation. If Error::Success() 204a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// returns true, the pretty printing completed successfully. 205a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 206a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan Error Print(Stream &output_stream, 207a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ExecutionContext &exe_ctx, 208a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan lldb::Format format, 209a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan bool show_types, 210a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan bool show_summary, 211a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan bool verbose); 212a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan}; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 214a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//---------------------------------------------------------------------- 215a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h" 216a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief Manages variables that the expression parser uses. 217a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 218a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// The expression parser uses variable lists in various contexts, as 219a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// discuessed at ClangExpressionVariable. This abstract class contains 220a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// the basic functions for managing a list of variables. Its subclasses 221a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// store pointers to variables or variables, depending on whether they 222a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// are backing stores or merely transient repositories. 223a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//---------------------------------------------------------------------- 224a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananclass ClangExpressionVariableListBase 225a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{ 226a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic: 227a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 228a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Return the number of variables in the list 229a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 230a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan virtual uint64_t Size() = 0; 231a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 2324a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 233a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Return the variable at the given index in the list 234a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 235a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan virtual ClangExpressionVariable &VariableAtIndex(uint64_t index) = 0; 236a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 237a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 238a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Add a new variable and return its index 239a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 240a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan virtual uint64_t AddVariable(ClangExpressionVariable& var) = 0; 241a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 242a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 243a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Finds a variable by name in the list. 2444a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// 245a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// @param[in] name 246a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The name of the requested variable. 2474a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// 2484a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan /// @return 249a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// The variable requested, or NULL if that variable is not in the list. 250a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 251a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable *GetVariable (const char *name) 252a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 253a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan for (uint64_t index = 0, size = Size(); index < size; ++index) 254a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 255a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable &candidate (VariableAtIndex(index)); 256a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan if (!candidate.m_name.compare(name)) 257a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return &candidate; 258a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 259a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return NULL; 260a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 2618c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2628c12720c108cd5e7ed792596749218d8400f647eSean Callanan //---------------------------------------------------------------------- 2638c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// Finds a variable by NamedDecl in the list. 2648c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// 2658c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// @param[in] name 2668c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// The name of the requested variable. 2678c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// 2688c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// @return 2698c12720c108cd5e7ed792596749218d8400f647eSean Callanan /// The variable requested, or NULL if that variable is not in the list. 2708c12720c108cd5e7ed792596749218d8400f647eSean Callanan //---------------------------------------------------------------------- 2718c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable *GetVariable (const clang::NamedDecl *decl) 2728c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan for (uint64_t index = 0, size = Size(); index < size; ++index) 2748c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 2758c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &candidate (VariableAtIndex(index)); 2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (candidate.m_parser_vars.get() && 2778c12720c108cd5e7ed792596749218d8400f647eSean Callanan candidate.m_parser_vars->m_named_decl == decl) 2788c12720c108cd5e7ed792596749218d8400f647eSean Callanan return &candidate; 2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 2808c12720c108cd5e7ed792596749218d8400f647eSean Callanan return NULL; 2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 282a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan}; 2838194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 284a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//---------------------------------------------------------------------- 285a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h" 286a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief A list of variable references. 287a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 2888194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan/// This class stores variables internally, acting as the permanent store. 289a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//---------------------------------------------------------------------- 2908194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callananclass ClangExpressionVariableStore : public ClangExpressionVariableListBase 291a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{ 292a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic: 2934a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 294a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Implementation of methods in ClangExpressionVariableListBase 295a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 296a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan uint64_t Size() 297a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 298a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return m_variables.size(); 299a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 300a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 301a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable &VariableAtIndex(uint64_t index) 302a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 3038194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan return m_variables[index]; 304a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 305a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 306a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan uint64_t AddVariable(ClangExpressionVariable &var) 307a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 3088194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan m_variables.push_back(var); 309a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return m_variables.size() - 1; 310a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 3118194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 3128194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan //---------------------------------------------------------------------- 3138194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan /// Create a new variable in the list and return its index 3148194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan //---------------------------------------------------------------------- 3158194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan uint64_t CreateVariable() 3168194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan { 3178194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan uint64_t index = m_variables.size(); 3188194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 3198194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan m_variables.push_back(ClangExpressionVariable()); 3208194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan m_variables[index].m_store = this; 3218194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan m_variables[index].m_index = index; 3228194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 3238194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan return index; 3248194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan } 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 3268194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan std::vector <ClangExpressionVariable> m_variables; 327a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan}; 328a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 329a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//---------------------------------------------------------------------- 330a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @class ClangExpressionVariableListBase ClangExpressionVariable.h "lldb/Expression/ClangExpressionVariable.h" 331a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// @brief A list of variable references. 332a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan/// 3338194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan/// This class stores references to variables stored elsewhere. 334a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan//---------------------------------------------------------------------- 3358194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callananclass ClangExpressionVariableList : public ClangExpressionVariableListBase 336a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan{ 337a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananpublic: 3384a7c6c62ac427ac3a390809a6ab1fe325cc69a0eSean Callanan //---------------------------------------------------------------------- 339a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan /// Implementation of methods in ClangExpressionVariableListBase 340a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan //---------------------------------------------------------------------- 341a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan uint64_t Size() 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3438194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan return m_references.size(); 344a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 345a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 346a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable &VariableAtIndex(uint64_t index) 347a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 3488194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan return m_references[index].first->VariableAtIndex(m_references[index].second); 349a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 351a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan uint64_t AddVariable(ClangExpressionVariable &var) 352a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan { 3538194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan m_references.push_back(ClangExpressionVariableRef(var.m_store, var.m_index)); 3548194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan return m_references.size() - 1; 355a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan } 356a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callananprivate: 3578194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan typedef std::pair <ClangExpressionVariableStore *, uint64_t> 3588194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan ClangExpressionVariableRef; 3598194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan 3608194e42fa9e0fe204ebadb2368eb486054d66bd3Sean Callanan std::vector <ClangExpressionVariableRef> m_references; 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_ClangExpressionVariable_h_ 366