ClangExpressionDeclMap.h revision 0fc7358d61218ba5d5abb5c2ea489a9ef936bbf7
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 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h" 24841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan#include "lldb/Symbol/TaggedASTType.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanannamespace llvm { 278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan class Value; 288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//---------------------------------------------------------------------- 331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// For cases in which there are multiple classes of types that are not 341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// interchangeable, to allow static type checking. 351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//---------------------------------------------------------------------- 361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytontemplate <unsigned int C> class TaggedClangASTType : public ClangASTType 371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonpublic: 391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton TaggedClangASTType (void *type, clang::ASTContext *ast_context) : 401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ClangASTType(type, ast_context) { } 411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton TaggedClangASTType (const TaggedClangASTType<C> &tw) : 431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ClangASTType(tw) { } 441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton TaggedClangASTType () : 461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ClangASTType() { } 471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ~TaggedClangASTType() { } 491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton const TaggedClangASTType<C> & 511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton operator= (const TaggedClangASTType<C> &tw) 521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ClangASTType::operator= (tw); 541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return *this; 551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}; 571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 59810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callananclass Error; 608f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananclass Function; 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass NameSearchContext; 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Variable; 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionDeclMap 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ClangExpressionDeclMap(ExecutionContext *exe_ctx); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~ClangExpressionDeclMap(); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Interface for ClangStmtVisitor 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool GetIndexForDecl (uint32_t &index, 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::Decl *decl); 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan // Interface for IRForTarget 758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool AddValueToStruct (llvm::Value *value, 768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan const clang::NamedDecl *decl, 77810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan std::string &name, 78810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan void *type, 79f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *ast_context, 808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t size, 818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t alignment); 828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool DoStructLayout (); 838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool GetStructInfo (uint32_t &num_elements, 848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t &size, 858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &alignment); 868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool GetStructElement (const clang::NamedDecl *&decl, 878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan llvm::Value *&value, 888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &offset, 898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan uint32_t index); 908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Interface for DwarfExpression 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Value *GetValueForIndex (uint32_t index); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // Interface for CommandObjectExpression 95f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool Materialize(ExecutionContext *exe_ctx, 96f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t &struct_address, 97f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &error); 98f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 9932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan bool DumpMaterializedStruct(ExecutionContext *exe_ctx, 10032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Stream &s, 10132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error &error); 10232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 103f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool Dematerialize(ExecutionContext *exe_ctx, 104f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value &result_value, 105f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &error); 106810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Interface for ClangASTSource 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void GetDecls (NameSearchContext &context, 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 1111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton typedef TaggedClangASTType<0> TypeFromParser; 1121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton typedef TaggedClangASTType<1> TypeFromUser; 113f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Tuple 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::NamedDecl *m_decl; 117f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser m_parser_type; 118f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser m_user_type; 119f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *m_value; /* owned by ClangExpressionDeclMap */ 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan struct StructMember 1238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 124810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan const clang::NamedDecl *m_decl; 125810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan llvm::Value *m_value; 126810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan std::string m_name; 127f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser m_parser_type; 1288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t m_offset; 1298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t m_size; 1308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t m_alignment; 1318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan }; 1328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<Tuple> TupleVector; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef TupleVector::iterator TupleIterator; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan typedef std::vector<StructMember> StructMemberVector; 1378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan typedef StructMemberVector::iterator StructMemberIterator; 1388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TupleVector m_tuples; 1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMemberVector m_members; 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext *m_exe_ctx; 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext *m_sym_ctx; /* owned by ClangExpressionDeclMap */ 1438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t m_struct_alignment; 1448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t m_struct_size; 1458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool m_struct_laid_out; 146f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t m_allocated_area; 147810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::addr_t m_materialized_location; 148810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 149336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *FindVariableInScope(const SymbolContext &sym_ctx, 150336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 151f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *type = NULL); 152336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 153336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Value *GetVariableValue(ExecutionContext &exe_ctx, 154336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var, 155f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *parser_ast_context, 156f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *found_type = NULL, 157f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser *parser_type = NULL); 158336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1598f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan void AddOneVariable(NameSearchContext &context, Variable *var); 1600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void AddOneFunction(NameSearchContext &context, Function *fun, Symbol *sym); 161810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 162f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool DoMaterialize (bool dematerialize, 163f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext *exe_ctx, 164f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *result_value, /* must be non-NULL if D is set */ 165f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err); 166f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 167f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool DoMaterializeOneVariable(bool dematerialize, 168f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext &exe_ctx, 169f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const SymbolContext &sym_ctx, 170f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const char *name, 171f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser type, 172f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t addr, 173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err); 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_ClangExpressionDeclMap_h_ 179