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