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