ClangExpressionDeclMap.h revision 93a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724
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 { 2793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan class Type; 288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan class Value; 298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callananclass Error; 348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananclass Function; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass NameSearchContext; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Variable; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionDeclMap 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ClangExpressionDeclMap(ExecutionContext *exe_ctx); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~ClangExpressionDeclMap(); 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Interface for ClangStmtVisitor 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool GetIndexForDecl (uint32_t &index, 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::Decl *decl); 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan // Interface for IRForTarget 498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool AddValueToStruct (llvm::Value *value, 508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan const clang::NamedDecl *decl, 51810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan std::string &name, 52810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan void *type, 53f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *ast_context, 548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t size, 558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t alignment); 568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool DoStructLayout (); 578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool GetStructInfo (uint32_t &num_elements, 588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t &size, 598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &alignment); 608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool GetStructElement (const clang::NamedDecl *&decl, 618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan llvm::Value *&value, 628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &offset, 638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan uint32_t index); 648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6502fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan bool GetFunctionInfo (const clang::NamedDecl *decl, 6602fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan llvm::Value**& value, 6702fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan uint64_t &ptr); 68ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 69f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan bool GetFunctionAddress (const char *name, 70f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan uint64_t &ptr); 71f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Interface for DwarfExpression 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Value *GetValueForIndex (uint32_t index); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // Interface for CommandObjectExpression 76f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool Materialize(ExecutionContext *exe_ctx, 77f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t &struct_address, 78f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &error); 79f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 8032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan bool DumpMaterializedStruct(ExecutionContext *exe_ctx, 8132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Stream &s, 8232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error &error); 8332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 84f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool Dematerialize(ExecutionContext *exe_ctx, 85f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value &result_value, 86f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &error); 87810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Interface for ClangASTSource 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void GetDecls (NameSearchContext &context, 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 92f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan typedef TaggedASTType<0> TypeFromParser; 93f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan typedef TaggedASTType<1> TypeFromUser; 94f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Tuple 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::NamedDecl *m_decl; 98f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser m_parser_type; 99f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser m_user_type; 100f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *m_value; /* owned by ClangExpressionDeclMap */ 10102fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan llvm::Value *m_llvm_value; 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan struct StructMember 1058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 106810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan const clang::NamedDecl *m_decl; 107810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan llvm::Value *m_value; 108810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan std::string m_name; 109f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser m_parser_type; 1108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t m_offset; 1118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t m_size; 1128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t m_alignment; 1138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan }; 1148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<Tuple> TupleVector; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef TupleVector::iterator TupleIterator; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan typedef std::vector<StructMember> StructMemberVector; 1198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan typedef StructMemberVector::iterator StructMemberIterator; 1208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TupleVector m_tuples; 1228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMemberVector m_members; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext *m_exe_ctx; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext *m_sym_ctx; /* owned by ClangExpressionDeclMap */ 1258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t m_struct_alignment; 1268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t m_struct_size; 1278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan bool m_struct_laid_out; 128f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t m_allocated_area; 129810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::addr_t m_materialized_location; 130810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 131336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *FindVariableInScope(const SymbolContext &sym_ctx, 132336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 133f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *type = NULL); 134336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 135336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Value *GetVariableValue(ExecutionContext &exe_ctx, 136336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var, 137f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *parser_ast_context, 138f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *found_type = NULL, 139f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser *parser_type = NULL); 140336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1418f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan void AddOneVariable(NameSearchContext &context, Variable *var); 1420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void AddOneFunction(NameSearchContext &context, Function *fun, Symbol *sym); 14393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan void AddOneType(NameSearchContext &context, Type *type); 144810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 145f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool DoMaterialize (bool dematerialize, 146f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext *exe_ctx, 147f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *result_value, /* must be non-NULL if D is set */ 148f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err); 149f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 150f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool DoMaterializeOneVariable(bool dematerialize, 151f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext &exe_ctx, 152f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const SymbolContext &sym_ctx, 153f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const char *name, 154f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser type, 155f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t addr, 156f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err); 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_ClangExpressionDeclMap_h_ 162