ClangExpressionDeclMap.h revision 336a0002b94c7f23573ec613c4d4ac89a67fd299
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"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace clang {
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class DeclarationName;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class DeclContext;
28810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    class QualType;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanannamespace llvm {
328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    class Value;
338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callananclass Error;
388f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananclass Function;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass NameSearchContext;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Variable;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ClangExpressionDeclMap
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangExpressionDeclMap(ExecutionContext *exe_ctx);
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~ClangExpressionDeclMap();
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Interface for ClangStmtVisitor
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool GetIndexForDecl (uint32_t &index,
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          const clang::Decl *decl);
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    // Interface for IRForTarget
538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool AddValueToStruct (llvm::Value *value,
548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           const clang::NamedDecl *decl,
55810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                           std::string &name,
56810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                           void *type,
578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           size_t size,
588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           off_t alignment);
598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool DoStructLayout ();
608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool GetStructInfo (uint32_t &num_elements,
618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                        size_t &size,
628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                        off_t &alignment);
638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool GetStructElement (const clang::NamedDecl *&decl,
648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           llvm::Value *&value,
658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           off_t &offset,
668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                           uint32_t index);
678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Interface for DwarfExpression
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Value *GetValueForIndex (uint32_t index);
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    // Interface for CommandObjectExpression
72810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    lldb::addr_t Materialize(ExecutionContext *exe_ctx,
73810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                             Error &error);
74810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Interface for ClangASTSource
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void GetDecls (NameSearchContext &context,
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   const char *name);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct Tuple
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const clang::NamedDecl  *m_decl;
83810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        clang::ASTContext       *m_ast_context;
84810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        void                    *m_orig_type;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Value                   *m_value; /* owned by ClangExpressionDeclMap */
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    struct StructMember
898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
90810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        const clang::NamedDecl *m_decl;
91810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        llvm::Value            *m_value;
92810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        std::string             m_name;
93810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        void                   *m_type;
948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        off_t                   m_offset;
958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        size_t                  m_size;
968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        off_t                   m_alignment;
978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    };
988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<Tuple> TupleVector;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef TupleVector::iterator TupleIterator;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    typedef std::vector<StructMember> StructMemberVector;
1038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    typedef StructMemberVector::iterator StructMemberIterator;
1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TupleVector         m_tuples;
1068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    StructMemberVector  m_members;
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ExecutionContext   *m_exe_ctx;
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext      *m_sym_ctx; /* owned by ClangExpressionDeclMap */
1098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t               m_struct_alignment;
1108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    size_t              m_struct_size;
1118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    bool                m_struct_laid_out;
112810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    lldb::addr_t        m_materialized_location;
113810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Variable *FindVariableInScope(const SymbolContext &sym_ctx,
115336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                  const char *name,
116336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                  void *type = NULL,
117336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                  clang::ASTContext *ast_context = NULL);
118336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
119336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Value *GetVariableValue(ExecutionContext &exe_ctx,
120336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                            Variable *var,
121336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                            clang::ASTContext *target_ast_context = NULL,
122336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                            void **opaque_type = NULL,
123336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                            clang::ASTContext **found_ast_context = NULL);
124336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1258f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    void AddOneVariable(NameSearchContext &context, Variable *var);
1268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    void AddOneFunction(NameSearchContext &context, Function *fun);
127810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
128810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    bool MaterializeOneVariable(ExecutionContext &exe_ctx,
129810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                                const SymbolContext &sym_ctx,
130810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                                const char *name,
131810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                                void *type,
132810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                                clang::ASTContext *ast_context,
133336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                lldb::addr_t addr,
134336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                Error &err);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ClangExpressionDeclMap_h_
140