11674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//===-- ClangASTType.h ------------------------------------------*- C++ -*-===//
21674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//
31674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//                     The LLVM Compiler Infrastructure
41674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//
51674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// This file is distributed under the University of Illinois Open Source
61674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// License. See LICENSE.TXT for details.
71674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//
81674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//===----------------------------------------------------------------------===//
91674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#ifndef liblldb_ClangASTType_h_
111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#define liblldb_ClangASTType_h_
121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
133e1c95a5eccc5fca012fcd91226ea67710b7ff26Peter Collingbourne#include <string>
14b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-private.h"
151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/ClangForward.h"
1652f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/Type.h"
171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonnamespace lldb_private {
191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//----------------------------------------------------------------------
211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// A class that can carry around a clang ASTContext and a opaque clang
221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// QualType. A clang::QualType can be easily reconstructed from an
231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// opaque clang type and often the ASTContext is needed when doing
241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// various type related tasks, so this class allows both items to travel
251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// in a single very lightweight class that can be used. There are many
261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// static equivalents of the member functions that allow the ASTContext
271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// and the opaque clang QualType to be specified for ease of use and
281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// to avoid code duplication.
291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//----------------------------------------------------------------------
301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclass ClangASTType
311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
3257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonpublic:
3352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    enum {
3452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeHasChildren        = (1u <<  0),
3552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeHasValue           = (1u <<  1),
3652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsArray            = (1u <<  2),
3752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsBlock            = (1u <<  3),
3852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsBuiltIn          = (1u <<  4),
3952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsClass            = (1u <<  5),
4052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsCPlusPlus        = (1u <<  6),
4152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsEnumeration      = (1u <<  7),
4252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsFuncPrototype    = (1u <<  8),
4352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsMember           = (1u <<  9),
4452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsObjC             = (1u << 10),
4552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsPointer          = (1u << 11),
4652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsReference        = (1u << 12),
4752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsStructUnion      = (1u << 13),
4852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsTemplate         = (1u << 14),
4952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsTypedef          = (1u << 15),
5052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsVector           = (1u << 16),
5152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsScalar           = (1u << 17),
5252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsInteger          = (1u << 18),
5352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsFloat            = (1u << 19),
5452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsComplex          = (1u << 20),
5552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        eTypeIsSigned           = (1u << 21)
5652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    };
5752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
5852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
5952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
6052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Constructors and Destructors
6152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
62979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ClangASTType (clang::ASTContext *ast_context, lldb::clang_type_t type) :
630fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type (type),
640fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_ast  (ast_context)
651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
6752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
6852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType (clang::ASTContext *ast_context, clang::QualType qual_type);
6952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
7052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType (const ClangASTType &rhs) :
7152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_type (rhs.m_type),
7252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_ast  (rhs.m_ast)
731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    ClangASTType () :
771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        m_type (0),
781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        m_ast  (0)
791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
8252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ~ClangASTType();
831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
8452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
8552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Operators
8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
8752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    const ClangASTType &
8952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    operator= (const ClangASTType &rhs)
901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
9152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_type = rhs.m_type;
9252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_ast = rhs.m_ast;
931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return *this;
941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
9652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
9752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
9852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Tests
9952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
10052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
10152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    operator bool () const
10252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
10352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_type != NULL && m_ast != NULL;
10452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
10552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
10652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
10752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    operator < (const ClangASTType &rhs) const
10852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
10952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (m_ast == rhs.m_ast)
11052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return m_type < rhs.m_type;
11152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_ast < rhs.m_ast;
11252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
11352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
1140fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    bool
1150fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    IsValid () const
1160fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
1170fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_type != NULL && m_ast != NULL;
1180fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
11952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
12052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
12152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsArrayType (ClangASTType *element_type,
12252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 uint64_t *size,
12352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 bool *is_incomplete) const;
1240fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
12552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
12652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsArrayOfScalarType () const;
12752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
12852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
12952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsAggregateType () const;
13052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
13152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
13252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsBeingDefined () const;
13352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
13452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
13552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsCharType () const;
13652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
13752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
13852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsCompleteType () const;
13952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
14152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsConst() const;
14252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
14452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsCStringType (uint32_t &length) const;
14552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
14752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsCXXClassType () const;
14852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
15052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsDefined() const;
15152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
15252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
15352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsFloatingPointType (uint32_t &count, bool &is_complex) const;
15452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
15552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
15652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsFunctionType (bool *is_variadic_ptr = NULL) const;
15752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
15852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
15952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsVariadicFunctionType () const;
16052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
16152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
16252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsFunctionPointerType () const;
16352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
16452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
16552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsIntegerType (bool &is_signed) const;
16652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
16752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
16852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsObjCClassType () const;
16952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
17052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
17152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsObjCClassTypeAndHasIVars (bool check_superclass) const;
17252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
17352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
17452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsObjCObjectOrInterfaceType () const;
17552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
17652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
17752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsObjCObjectPointerType (ClangASTType *target_type = NULL);
17852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
17952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
18052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsPolymorphicClass () const;
18152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
18252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
18352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsPossibleCPlusPlusDynamicType (ClangASTType *target_type = NULL) const
18452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
18552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return IsPossibleDynamicType (target_type, true, false);
1861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
1871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
18852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
18952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsPossibleDynamicType (ClangASTType *target_type, // Can pass NULL
19052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           bool check_cplusplus,
19152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           bool check_objc) const;
19252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
19352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
19452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
19552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsPointerToScalarType () const;
19652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
19752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
19852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsPointerType (ClangASTType *pointee_type = NULL) const;
19952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
20052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
20152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsPointerOrReferenceType (ClangASTType *pointee_type = NULL) const;
20252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
20352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
20452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsReferenceType (ClangASTType *pointee_type = NULL) const;
20552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
20652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
20752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsScalarType () const;
20852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
20952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
21052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsTypedefType () const;
21152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
21252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
21352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IsVoidType () const;
21452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
21552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
21652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetCXXClassName (std::string &class_name) const;
21752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
21852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
21952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetObjCClassName (std::string &class_name);
22052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
22152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
22252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
22352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Type Completion
22452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
22552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
22752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetCompleteType () const;
22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
22952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // AST related queries
23152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
23252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
23352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    size_t
23452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetPointerByteSize () const;
23552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
23652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
23752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Accessors
23852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
23952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
2401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    clang::ASTContext *
2411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    GetASTContext() const
24252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
24352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_ast;
2441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ConstString
24752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetConstQualifiedTypeName () const;
2481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
24952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ConstString
25052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetConstTypeName () const;
25152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
25252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::string
25352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTypeName () const;
254946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
25552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTypeInfo (ClangASTType *pointee_or_element_clang_type = NULL) const;
25752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
25852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    lldb::LanguageType
25952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetMinimumLanguage ();
26052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
26152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    lldb::clang_type_t
26252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetOpaqueQualType() const
263946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    {
26452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_type;
265946618a80e17d210e6592e94d10a15ad592572baGreg Clayton    }
266946618a80e17d210e6592e94d10a15ad592572baGreg Clayton
26752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    lldb::TypeClass
26852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTypeClass () const;
269dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
27052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    void
27152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetClangType (clang::ASTContext *ast, lldb::clang_type_t type)
27252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
27352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_ast = ast;
27452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_type = type;
27552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
2761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
27752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    void
27852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetClangType (clang::ASTContext *ast, clang::QualType qual_type);
2790b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
28052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    unsigned
28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTypeQualifiers() const;
28252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
28352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
28452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Creating related types
28552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
2860b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
28752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
28852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddConstModifier () const;
2890b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
29052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
29152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddRestrictModifier () const;
29252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
29352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
29452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddVolatileModifier () const;
29552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
29652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Using the current type, create a new typedef to that type using "typedef_name"
29752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // as the name and "decl_ctx" as the decl context.
29852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
29952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CreateTypedefType (const char *typedef_name,
30052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                       clang::DeclContext *decl_ctx) const;
30152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
30252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
30352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetArrayElementType (uint64_t& stride) const;
30452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
30552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
30652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetCanonicalType () const;
3075c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton
30852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
30952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetFullyUnqualifiedType () const;
31052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
31152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Returns -1 if this isn't a function of if the fucntion doesn't have a prototype
31252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Returns a value >= 0 if there is a prototype.
31352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    int
31452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetFunctionArgumentCount () const;
31552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
31652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
31752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetFunctionArgumentTypeAtIndex (size_t idx);
318dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
31952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
32052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetFunctionReturnType () const;
32152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
32252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
32352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetLValueReferenceType () const;
32452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
32552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
32652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNonReferenceType () const;
327b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton
32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
32952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetPointeeType () const;
33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
33152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
33252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetPointerType () const;
33352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetRValueReferenceType () const;
336b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton
33752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // If the current object represents a typedef type, get the underlying type
33852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
33952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTypedefedType () const;
340940ca9447d84a08883d2ce77a765475f09243fc5Greg Clayton
34152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
34252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RemoveFastQualifiers () const;
343f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
34552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Create related types using the current type's AST
34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
34752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicTypeFromAST (lldb::BasicType basic_type) const;
34952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
35052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
35152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Exploring the type
35252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
35352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
354fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t
35552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetByteSize () const;
356960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
35752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint64_t
35852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBitSize () const;
35952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
36052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    lldb::Encoding
36152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetEncoding (uint64_t &count) const;
36252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
36352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    lldb::Format
36452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetFormat () const;
36552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
36652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    size_t
36752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTypeBitAlign () const;
36852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
36952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
37052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumChildren (bool omit_empty_base_classes) const;
37152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
37252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    lldb::BasicType
37352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicTypeEnumeration () const;
374960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
37552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static lldb::BasicType
37652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetBasicTypeEnumeration (const ConstString &name);
37752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
37852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
37952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumDirectBaseClasses () const;
38052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
38152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
38252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumVirtualBaseClasses () const;
38352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
38452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
38552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumFields () const;
38652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
38752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
38852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetDirectBaseClassAtIndex (size_t idx,
38952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               uint32_t *bit_offset_ptr) const;
39052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
39152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
39252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetVirtualBaseClassAtIndex (size_t idx,
39352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                uint32_t *bit_offset_ptr) const;
39452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
39552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
39652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetFieldAtIndex (size_t idx,
39752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     std::string& name,
39852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     uint64_t *bit_offset_ptr,
39952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     uint32_t *bitfield_bit_size_ptr,
40052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     bool *is_bitfield_ptr) const;
40152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
40252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
40352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetIndexOfFieldWithName (const char* name,
40452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             ClangASTType* field_clang_type = NULL,
40552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             uint64_t *bit_offset_ptr = NULL,
40652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             uint32_t *bitfield_bit_size_ptr = NULL,
40752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             bool *is_bitfield_ptr = NULL) const;
40852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
40952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
41052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumPointeeChildren () const;
41152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
41252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
41352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
41452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              const char *parent_name,
41552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              size_t idx,
41652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool transparent_pointers,
41752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool omit_empty_base_classes,
41852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool ignore_array_bounds,
41952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              std::string& child_name,
42052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              uint32_t &child_byte_size,
42152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              int32_t &child_byte_offset,
42252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              uint32_t &child_bitfield_bit_size,
42352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              uint32_t &child_bitfield_bit_offset,
42452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool &child_is_base_class,
42552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool &child_is_deref_of_parent) const;
42652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
42752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Lookup a child given a name. This function will match base class names
42852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // and member member names in "clang_type" only, not descendants.
42952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t
43052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetIndexOfChildWithName (const char *name,
43152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             bool omit_empty_base_classes) const;
43252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
43352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Lookup a child member given a name. This function will match member names
43452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // only and will descend into "clang_type" children in search for the first
43552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // member in this class, or any base class that matches "name".
43652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // TODO: Return all matches for a given name by returning a vector<vector<uint32_t>>
43752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // so we catch all names that match a given child name, not just the first.
438960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    size_t
43952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetIndexOfChildMemberWithName (const char *name,
44052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   bool omit_empty_base_classes,
44152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   std::vector<uint32_t>& child_indexes) const;
442960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
44352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    size_t
44452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetNumTemplateArguments () const;
44552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
44652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
44752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetTemplateArgument (size_t idx,
44852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         lldb::TemplateArgumentKind &kind) const;
449960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
45062fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton
45152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
45252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Modifying RecordType
45352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
45452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::FieldDecl *
45552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddFieldToRecordType (const char *name,
45652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          const ClangASTType &field_type,
45752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          lldb::AccessType access,
45852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          uint32_t bitfield_bit_size);
45952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
46052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    void
46152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    BuildIndirectFields ();
46252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
46352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::VarDecl *
46452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddVariableToRecordType (const char *name,
46552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             const ClangASTType &var_type,
46652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             lldb::AccessType access);
46752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
46852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::CXXMethodDecl *
46952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddMethodToCXXRecordType (const char *name,
47052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              const ClangASTType &method_type,
47152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              lldb::AccessType access,
47252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_virtual,
47352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_static,
47452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_inline,
47552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_explicit,
47652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_attr_used,
47752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_artificial);
47852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
47952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // C++ Base Classes
48052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::CXXBaseSpecifier *
48152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CreateBaseClassSpecifier (lldb::AccessType access,
48252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool is_virtual,
48352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                              bool base_of_class);
48452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
48552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    static void
48652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes,
48752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               unsigned num_base_classes);
48852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
48952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
49052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetBaseClassesForClassType (clang::CXXBaseSpecifier const * const *base_classes,
49152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                unsigned num_base_classes);
49252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
49352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
49452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
49552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetObjCSuperClass (const ClangASTType &superclass_clang_type);
49652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
49752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
49852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddObjCClassProperty (const char *property_name,
49952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          const ClangASTType &property_clang_type,
50052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          clang::ObjCIvarDecl *ivar_decl,
50152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          const char *property_setter_name,
50252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          const char *property_getter_name,
50352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          uint32_t property_attributes,
50452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                          ClangASTMetadata *metadata);
50552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
50652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::ObjCMethodDecl *
50752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddMethodToObjCObjectType (const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
50852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               const ClangASTType &method_clang_type,
50952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               lldb::AccessType access,
51052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               bool is_artificial);
51162fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton
51252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::DeclContext *
51352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetDeclContextForType () const;
514d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
515b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata
51677e67a51acb825d79d25be687c085833713d5205Greg Clayton    bool
51752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetDefaultAccessForRecordFields (int default_accessibility,
51852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     int *assigned_accessibilities,
51952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     size_t num_assigned_accessibilities);
52052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
52152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
52252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetHasExternalStorage (bool has_extern);
52352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
52452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
52552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //------------------------------------------------------------------
52652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // clang::TagType
52752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //------------------------------------------------------------------
52852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
52952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
53052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    SetTagTypeKind (int kind) const;
53152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
53252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //------------------------------------------------------------------
53352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Tag Declarations
53452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //------------------------------------------------------------------
53552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
53652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    StartTagDeclarationDefinition ();
53752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
53852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
53952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CompleteTagDeclarationDefinition ();
54077e67a51acb825d79d25be687c085833713d5205Greg Clayton
54152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
54252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Modifying Enumeration types
54352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
54452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool
54552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AddEnumerationValueToEnumerationType (const ClangASTType &enumerator_qual_type,
54652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          const Declaration &decl,
54752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          const char *name,
54852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          int64_t enum_value,
54952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          uint32_t enum_value_bit_size);
55052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
55152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
55277e67a51acb825d79d25be687c085833713d5205Greg Clayton
553b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata    ClangASTType
55452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetEnumerationIntegerType () const;
55552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
55652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
55752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //------------------------------------------------------------------
55852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Pointers & References
55952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //------------------------------------------------------------------
56052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
56152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Call this function using the class type when you want to make a
56252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // member pointer type to pointee_type.
56352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
56452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CreateMemberPointerType (const ClangASTType &pointee_type) const;
565b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata
566b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata
56752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Converts "s" to a floating point value and place resulting floating
56852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // point bytes in the "dst" buffer.
56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    size_t
57052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ConvertStringToFloatValue (const char *s,
57152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               uint8_t *dst,
57252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               size_t dst_size) const;
57352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
57452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Dumping types
57552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //----------------------------------------------------------------------
5761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    void
5771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    DumpValue (ExecutionContext *exe_ctx,
5781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               Stream *s,
5791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               lldb::Format format,
5801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               const DataExtractor &data,
581fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton               lldb::offset_t data_offset,
5821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               size_t data_byte_size,
5831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               uint32_t bitfield_bit_size,
5841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               uint32_t bitfield_bit_offset,
5851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               bool show_types,
5861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               bool show_summary,
5871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               bool verbose,
5881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton               uint32_t depth);
5891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
5901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    bool
5911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    DumpTypeValue (Stream *s,
5921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                   lldb::Format format,
5931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                   const DataExtractor &data,
594fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                   lldb::offset_t data_offset,
5951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                   size_t data_byte_size,
5961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                   uint32_t bitfield_bit_size,
59724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                   uint32_t bitfield_bit_offset,
59824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                   ExecutionContextScope *exe_scope);
5991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    void
6011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    DumpSummary (ExecutionContext *exe_ctx,
6021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                 Stream *s,
6031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                 const DataExtractor &data,
604fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                 lldb::offset_t data_offset,
6051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                 size_t data_byte_size);
606133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton
607133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton    void
60852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    DumpTypeDescription () const; // Dump to stdout
6091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
61052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    void
61152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    DumpTypeDescription (Stream *s) const;
6121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
6131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    bool
6141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    GetValueAsScalar (const DataExtractor &data,
615fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                      lldb::offset_t data_offset,
6161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                      size_t data_byte_size,
61752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                      Scalar &value) const;
618462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
6191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    bool
6201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    SetValueFromScalar (const Scalar &value,
6211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        Stream &strm);
6221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    bool
6241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    ReadFromMemory (ExecutionContext *exe_ctx,
6251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    lldb::addr_t addr,
626b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType address_type,
6271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    DataExtractor &data);
6281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    bool
6301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    WriteToMemory (ExecutionContext *exe_ctx,
6311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                   lldb::addr_t addr,
632b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                   AddressType address_type,
6331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                   StreamString &new_value);
6341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
635915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
63652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::RecordDecl *
63752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetAsRecordDecl () const;
638915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
63952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::CXXRecordDecl *
64052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetAsCXXRecordDecl () const;
641915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
64252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::ObjCInterfaceDecl *
64352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetAsObjCInterfaceDecl () const;
64488db4597c7567be050b7a729f7306832f28428bbGreg Clayton
6457dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
6467dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    Clear()
6477dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    {
6487dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_type = NULL;
6497dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton        m_ast = NULL;
6507dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    }
6517dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton
65252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::QualType
65352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetQualType () const
65452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
65552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (m_type)
65652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return clang::QualType::getFromOpaquePtr(m_type);
65752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return clang::QualType();
65852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
65952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::QualType
66052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    GetCanonicalQualType () const
66152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
66252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (m_type)
66352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return clang::QualType::getFromOpaquePtr(m_type).getCanonicalType();
66452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return clang::QualType();
66552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
66652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
6671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonprivate:
66857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    lldb::clang_type_t m_type;
66957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    clang::ASTContext *m_ast;
67052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
6711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton};
6721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6730fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonbool operator == (const ClangASTType &lhs, const ClangASTType &rhs);
6740fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonbool operator != (const ClangASTType &lhs, const ClangASTType &rhs);
6750fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
6761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} // namespace lldb_private
6781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#endif // #ifndef liblldb_ClangASTType_h_
680