10b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton//===-- ClangASTType.cpp ----------------------------------------*- 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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/ASTConsumer.h"
151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/ASTContext.h"
1652f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/Attr.h"
1752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/CXXInheritance.h"
181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/Decl.h"
191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/DeclCXX.h"
20960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton#include "clang/AST/DeclObjC.h"
211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/DeclGroup.h"
2252f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/DeclTemplate.h"
231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/RecordLayout.h"
245c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "clang/AST/Type.h"
251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/Builtins.h"
271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/IdentifierTable.h"
281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/LangOptions.h"
291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/SourceManager.h"
301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/TargetInfo.h"
311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "llvm/Support/FormattedStream.h"
331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "llvm/Support/raw_ostream.h"
341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/ConstString.h"
361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/DataBufferHeap.h"
371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/DataExtractor.h"
38921fac021ef9f7e5d32de359e67d5ad28fcccc65Peter Collingbourne#include "lldb/Core/Debugger.h"
391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/Scalar.h"
401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/Stream.h"
411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/StreamString.h"
421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTContext.h"
43017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
4452f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "lldb/Symbol/VerifyDecl.h"
451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Target/ExecutionContext.h"
461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Target/Process.h"
471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
480b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton#include <mutex>
490b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
50b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Claytonusing namespace lldb;
511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonusing namespace lldb_private;
5252f792329be5db8e38961350589e97e8f2823acdGreg Claytonusing namespace clang;
5352f792329be5db8e38961350589e97e8f2823acdGreg Claytonusing namespace llvm;
541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
5552f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic bool
5652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetCompleteQualType (ASTContext *ast, QualType qual_type, bool allow_completion = true)
571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
5852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
6052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
6152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
6252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:
6352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:
6452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
6552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ArrayType *array_type = dyn_cast<ArrayType>(qual_type.getTypePtr());
6652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
6752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (array_type)
6852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
6952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
7052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
7152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
7252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
7352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:
7452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
7552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr());
7652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (tag_type)
7752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
7852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                TagDecl *tag_decl = tag_type->getDecl();
7952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (tag_decl)
8052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
8152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (tag_decl->isCompleteDefinition())
8252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return true;
8352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
8452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (!allow_completion)
8552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return false;
8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
8752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (tag_decl->hasExternalLexicalStorage())
8852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
8952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (ast)
9052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
9152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ExternalASTSource *external_ast_source = ast->getExternalSource();
9252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (external_ast_source)
9352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
9452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                external_ast_source->CompleteType(tag_decl);
9552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                return !tag_type->isIncompleteType();
9652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
9752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
9852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
9952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return false;
10052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
10152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
10252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
10352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
10452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
10552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
10652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
10752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
10852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
10952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
11052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (objc_class_type)
11152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
11252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
11352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // We currently can't complete objective C types through the newly added ASTContext
11452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // because it only supports TagDecl objects right now...
11552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (class_interface_decl)
11652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
11752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl->getDefinition())
11852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return true;
11952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
12052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (!allow_completion)
12152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return false;
12252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
12352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl->hasExternalLexicalStorage())
12452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
12552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (ast)
12652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
12752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ExternalASTSource *external_ast_source = ast->getExternalSource();
12852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (external_ast_source)
12952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
13052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                external_ast_source->CompleteType (class_interface_decl);
13152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                return !objc_class_type->isIncompleteType();
13252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
13352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
13452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
13552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return false;
13652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
13752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
13852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
13952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
14052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
14252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
14352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
14552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion);
14652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
14752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
14852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return GetCompleteQualType (ast, cast<ParenType>(qual_type)->desugar(), allow_completion);
14952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
15052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
15152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
15252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
15352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
15452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return true;
1551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
1561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
15752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic ObjCIvarDecl::AccessControl
15852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
1591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
16052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (access)
1611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
16252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eAccessNone:      return ObjCIvarDecl::None;
16352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eAccessPublic:    return ObjCIvarDecl::Public;
16452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eAccessPrivate:   return ObjCIvarDecl::Private;
16552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eAccessProtected: return ObjCIvarDecl::Protected;
16652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case eAccessPackage:   return ObjCIvarDecl::Package;
167b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton    }
16852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ObjCIvarDecl::None;
169b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton}
1701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
17152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
17252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Tests
17352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
1741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
17552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::ClangASTType (clang::ASTContext *ast,
17652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            clang::QualType qual_type) :
17752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_type (qual_type.getAsOpaquePtr()),
17852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_ast (ast)
179946618a80e17d210e6592e94d10a15ad592572baGreg Clayton{
180946618a80e17d210e6592e94d10a15ad592572baGreg Clayton}
181b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton
18252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::~ClangASTType()
1835c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton{
184b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton}
185b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton
18652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
18752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Tests
18852f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
18952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
19052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
19152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsAggregateType () const
192dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{
19352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
19452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
19552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
19652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
19752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
19852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
19952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
20052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
20152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:
20252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:
20352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
20452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:
20552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:
20652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
20752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
20852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
20952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
21052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
21152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsAggregateType();
21252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
21352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsAggregateType();
21452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
21552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).IsAggregateType();
21652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
21752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
21852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
21952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // The clang type does have a value
22052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
221dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton}
222dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
22352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
22452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsArrayType (ClangASTType *element_type_ptr,
22552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           uint64_t *size,
22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           bool *is_incomplete) const
227dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{
22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
22952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
23152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
23252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
23352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
23452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
23552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
23652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
23752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
23852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ConstantArray:
23952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (element_type_ptr)
24052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    element_type_ptr->SetClangType (m_ast, cast<ConstantArrayType>(qual_type)->getElementType());
24152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (size)
24252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
24352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
24452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::IncompleteArray:
24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (element_type_ptr)
24752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    element_type_ptr->SetClangType (m_ast, cast<IncompleteArrayType>(qual_type)->getElementType());
24852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (size)
24952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *size = 0;
25052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (is_incomplete)
25152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *is_incomplete = true;
25252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
25352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
25452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::VariableArray:
25552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (element_type_ptr)
25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    element_type_ptr->SetClangType (m_ast, cast<VariableArrayType>(qual_type)->getElementType());
25752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (size)
25852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *size = 0;
25952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
26052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
26152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::DependentSizedArray:
26252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (element_type_ptr)
26352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    element_type_ptr->SetClangType (m_ast, cast<DependentSizedArrayType>(qual_type)->getElementType());
26452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (size)
26552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *size = 0;
26652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
26752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
26852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
26952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsArrayType (element_type_ptr,
27052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                       size,
27152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                       is_incomplete);
27252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
27352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsArrayType (element_type_ptr,
27452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                          size,
27552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                          is_incomplete);
27652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
27752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsArrayType (element_type_ptr,
27852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                       size,
27952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                       is_incomplete);
28052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
28252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (element_type_ptr)
28352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        element_type_ptr->Clear();
28452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (size)
28552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        *size = 0;
28652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (is_incomplete)
28752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        *is_incomplete = false;
28852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
289dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton}
290dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
291dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
29252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
29352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCharType () const
294b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton{
29552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
29652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
29752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetQualType().getUnqualifiedType()->isCharType();
2985c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton}
299585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton
30052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
30152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
30252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCompleteType () const
303585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton{
30452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
30552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
30652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const bool allow_completion = false;
30752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetCompleteQualType (m_ast, GetQualType(), allow_completion);
308585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton}
309585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton
31052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
31152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsConst() const
312585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton{
31352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetQualType().isConstQualified();
314585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton}
315585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton
31652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
31752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCStringType (uint32_t &length) const
318915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{
31952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType pointee_or_element_clang_type;
32052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    length = 0;
32152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    Flags type_flags (GetTypeInfo (&pointee_or_element_clang_type));
32252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
32352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!pointee_or_element_clang_type.IsValid())
32452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
32552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
32652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
32752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (pointee_or_element_clang_type.IsCharType())
32952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (type_flags.Test (eTypeIsArray))
33152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
33252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // We know the size of the array and it could be a C string
33352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // since it is an array of characters
33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                length = cast<ConstantArrayType>(GetCanonicalQualType().getTypePtr())->getSize().getLimitedValue();
33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
33652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
33752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
33852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
33952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
34052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
341915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata}
342915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
34352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
34452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsFunctionType (bool *is_variadic_ptr) const
345915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{
34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
347915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    {
34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
349915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
35052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (qual_type->isFunctionType())
35152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
35252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (is_variadic_ptr)
35352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
35452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
35552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (function_proto_type)
35652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *is_variadic_ptr = function_proto_type->isVariadic();
35752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
35852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    *is_variadic_ptr = false;
35952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
36052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
36152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
362915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
36352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
36452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
36552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
36652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
36752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
36852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
36952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsFunctionType();
37052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
37152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsFunctionType();
37252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
37352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsFunctionType();
37452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
37552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::LValueReference:
37652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::RValueReference:
37752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
37852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
37952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (reference_type)
38052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (m_ast, reference_type->getPointeeType()).IsFunctionType();
38152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
38252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
38352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
384915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    }
38552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
386915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata}
387915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
388915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
38952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
39052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsFunctionPointerType () const
391915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{
39252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
393915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    {
39452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
39552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
39652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (qual_type->isFunctionPointerType())
39752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
398915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
39952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
40052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
40152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
40252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
40352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
40452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
40552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsFunctionPointerType();
40652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
40752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsFunctionPointerType();
40852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
40952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsFunctionPointerType();
41052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
41152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:
41252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:
41352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
41452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
41552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (reference_type)
41652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (m_ast, reference_type->getPointeeType()).IsFunctionPointerType();
41752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
41852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
41952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
420915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    }
42152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
422b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata
423b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata}
424b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata
42552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
42652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsIntegerType (bool &is_signed) const
427b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata{
42852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
42952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
43052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
43152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
43252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
43352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
43452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (builtin_type)
43552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
43652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (builtin_type->isInteger())
43752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
43852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            is_signed = builtin_type->isSignedInteger();
43952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
44052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
44152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
44252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
44352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
444b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata}
445b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata
44652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
44752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPointerType (ClangASTType *pointee_type) const
4481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
44952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
45052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
45152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
45252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
45352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
45452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
45552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Builtin:
45652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (cast<clang::BuiltinType>(qual_type)->getKind())
45752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
45852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    default:
45952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        break;
46052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case clang::BuiltinType::ObjCId:
46152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case clang::BuiltinType::ObjCClass:
46252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return true;
46352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
46452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return false;
46552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObjectPointer:
46652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
46752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType (m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType());
46852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
46952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::BlockPointer:
47052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
47152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType (m_ast, cast<BlockPointerType>(qual_type)->getPointeeType());
47252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
47352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Pointer:
47452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
47552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType (m_ast, cast<PointerType>(qual_type)->getPointeeType());
47652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
47752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::MemberPointer:
47852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
47952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType (m_ast, cast<MemberPointerType>(qual_type)->getPointeeType());
48052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
48152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
48252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPointerType(pointee_type);
48352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
48452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsPointerType(pointee_type);
48552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
48652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsPointerType(pointee_type);
48752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
48852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
48952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
49052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
49152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (pointee_type)
49252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        pointee_type->Clear();
49352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
4941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
4951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
4961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
49777e67a51acb825d79d25be687c085833713d5205Greg Claytonbool
49852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPointerOrReferenceType (ClangASTType *pointee_type) const
49977e67a51acb825d79d25be687c085833713d5205Greg Clayton{
50052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
50177e67a51acb825d79d25be687c085833713d5205Greg Clayton    {
50252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
50377e67a51acb825d79d25be687c085833713d5205Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
50477e67a51acb825d79d25be687c085833713d5205Greg Clayton        switch (type_class)
50577e67a51acb825d79d25be687c085833713d5205Greg Clayton        {
50652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Builtin:
50752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (cast<clang::BuiltinType>(qual_type)->getKind())
50852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
50952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                default:
51052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
51152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCId:
51252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCClass:
51352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
51452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
51552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return false;
51652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObjectPointer:
51752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
51852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType());
51952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
52052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::BlockPointer:
52152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
52252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<BlockPointerType>(qual_type)->getPointeeType());
52352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
52452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Pointer:
52552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
52652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<PointerType>(qual_type)->getPointeeType());
52752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
52852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::MemberPointer:
52952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
53052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<MemberPointerType>(qual_type)->getPointeeType());
53152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
53252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::LValueReference:
53352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
53452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
53552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
53652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::RValueReference:
53752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
53852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
53952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
54052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
54152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPointerOrReferenceType(pointee_type);
54252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
54352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsPointerOrReferenceType(pointee_type);
54452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
54552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsPointerOrReferenceType(pointee_type);
54677e67a51acb825d79d25be687c085833713d5205Greg Clayton            default:
54777e67a51acb825d79d25be687c085833713d5205Greg Clayton                break;
54877e67a51acb825d79d25be687c085833713d5205Greg Clayton        }
54977e67a51acb825d79d25be687c085833713d5205Greg Clayton    }
55052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (pointee_type)
55152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        pointee_type->Clear();
55277e67a51acb825d79d25be687c085833713d5205Greg Clayton    return false;
55377e67a51acb825d79d25be687c085833713d5205Greg Clayton}
55477e67a51acb825d79d25be687c085833713d5205Greg Clayton
555d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
55652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
55752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsReferenceType (ClangASTType *pointee_type) const
55852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
55952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
56052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
56152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
56252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
56352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
56452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
56552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
56652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::LValueReference:
56752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
56852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
57052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::RValueReference:
57152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_type)
57252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
57352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
57452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
57552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsReferenceType(pointee_type);
57652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
57752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsReferenceType(pointee_type);
57852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
57952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsReferenceType(pointee_type);
58052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
58152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
58252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
58352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
58452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
58552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (pointee_type)
58652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        pointee_type->Clear();
58752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
58852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
58952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
59052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
59152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsFloatingPointType (uint32_t &count, bool &is_complex) const
59252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
59352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
59452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
59552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
59652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
59752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
59852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
59952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            clang::BuiltinType::Kind kind = BT->getKind();
60052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
60152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
60252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                count = 1;
60352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                is_complex = false;
60452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
60552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
60652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
60752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
60852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
60952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (ClangASTType (m_ast, CT->getElementType()).IsFloatingPointType (count, is_complex))
61052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
61152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                count = 2;
61252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                is_complex = true;
61352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
61452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
61552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
61652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
61752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
61852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (ClangASTType (m_ast, VT->getElementType()).IsFloatingPointType (count, is_complex))
61952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
62052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                count = VT->getNumElements();
62152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                is_complex = false;
62252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
62352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
62452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
62552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
62652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    count = 0;
62752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    is_complex = false;
62852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
62952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
63052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
63152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
63252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
63352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsDefined() const
63452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
63552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
63652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
63752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
63852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetQualType());
63952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr());
64052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (tag_type)
64152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
64252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        TagDecl *tag_decl = tag_type->getDecl();
64352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (tag_decl)
64452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return tag_decl->isCompleteDefinition();
64552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
64652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
64752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
64852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
64952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
65052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (objc_class_type)
65152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
65252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
65352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (class_interface_decl)
65452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return class_interface_decl->getDefinition() != NULL;
65552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return false;
65652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
65752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
65852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return true;
65952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
66052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
66152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
66252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCClassType () const
66352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
66452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
66552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
66652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
66752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
66852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
66952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
67052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (obj_pointer_type)
67152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return obj_pointer_type->isObjCClassType();
67252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
67352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
67452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
67552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
67652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
67752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCObjectOrInterfaceType () const
67852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
67952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
68052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return GetCanonicalQualType()->isObjCObjectOrInterfaceType();
68152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
68252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
68352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
68452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
68552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPolymorphicClass () const
68652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
68752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
68852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
68952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetCanonicalQualType());
69052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
69152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
69252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
69352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Record:
69452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType())
69552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
69652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
69752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const RecordDecl *record_decl = record_type->getDecl();
69852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (record_decl)
69952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
70052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
70152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (cxx_record_decl)
70252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return cxx_record_decl->isPolymorphic();
70352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
70452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
70552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
70652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
70752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
70852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
70952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
71052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
71152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
71252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
71352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
71452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
71552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPossibleDynamicType (ClangASTType *dynamic_pointee_type,
71652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     bool check_cplusplus,
71752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     bool check_objc) const
71852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
71952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType pointee_qual_type;
72052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_type)
72152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
72252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
72352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bool success = false;
72452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
72552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
72652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
72752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Builtin:
72852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (check_objc && cast<BuiltinType>(qual_type)->getKind() == BuiltinType::ObjCId)
72952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
73052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (dynamic_pointee_type)
73152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        dynamic_pointee_type->SetClangType(m_ast, m_type);
73252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
73352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
73452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
73552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
73652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObjectPointer:
73752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (check_objc)
73852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
73952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (dynamic_pointee_type)
74052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        dynamic_pointee_type->SetClangType(m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType());
74152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
74252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
74352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
74452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
74552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Pointer:
74652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
74752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                success = true;
74852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
74952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
75052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::LValueReference:
75152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::RValueReference:
75252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
75352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                success = true;
75452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
75552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
75652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
75752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast,
75852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPossibleDynamicType (dynamic_pointee_type,
75952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                          check_cplusplus,
76052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                          check_objc);
76152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
76252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
76352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast,
76452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     cast<ElaboratedType>(qual_type)->getNamedType()).IsPossibleDynamicType (dynamic_pointee_type,
76552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                             check_cplusplus,
76652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                             check_objc);
76752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
76852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
76952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast,
77052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     cast<ParenType>(qual_type)->desugar()).IsPossibleDynamicType (dynamic_pointee_type,
77152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                   check_cplusplus,
77252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                   check_objc);
77352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
77452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
77552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
77652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
77752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (success)
77852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
77952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // Check to make sure what we are pointing too is a possible dynamic C++ type
78052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // We currently accept any "void *" (in case we have a class that has been
78152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // watered down to an opaque pointer) and virtual C++ classes.
78252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
78352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (pointee_type_class)
78452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
78552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::Type::Builtin:
78652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    switch (cast<BuiltinType>(pointee_qual_type)->getKind())
78752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
78852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::UnknownAny:
78952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Void:
79052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (dynamic_pointee_type)
79152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type);
79252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return true;
79352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
79452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::NullPtr:
79552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Bool:
79652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Char_U:
79752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::UChar:
79852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::WChar_U:
79952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Char16:
80052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Char32:
80152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::UShort:
80252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::UInt:
80352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::ULong:
80452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::ULongLong:
80552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::UInt128:
80652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Char_S:
80752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::SChar:
80852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::WChar_S:
80952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Short:
81052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Int:
81152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Long:
81252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::LongLong:
81352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Int128:
81452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Float:
81552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Double:
81652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::LongDouble:
81752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Dependent:
81852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Overload:
81952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::ObjCId:
82052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::ObjCClass:
82152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::ObjCSel:
82252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::BoundMember:
82352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::Half:
82452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::ARCUnbridgedCast:
82552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::PseudoObject:
82652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::BuiltinFn:
82752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLEvent:
82852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLImage1d:
82952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLImage1dArray:
83052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLImage1dBuffer:
83152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLImage2d:
83252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLImage2dArray:
83352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLImage3d:
83452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case BuiltinType::OCLSampler:
83552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        break;
83652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
83752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
83852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
83952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::Type::Record:
84052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (check_cplusplus)
84152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
84252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
84352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (cxx_record_decl)
84452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
84552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            bool is_complete = cxx_record_decl->isCompleteDefinition();
84652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
84752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (is_complete)
84852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                success = cxx_record_decl->isDynamicClass();
84952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            else
85052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
85152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ClangASTMetadata *metadata = ClangASTContext::GetMetadata (m_ast, cxx_record_decl);
85252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (metadata)
85352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    success = metadata->GetIsDynamicCXXType();
85452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                else
85552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
85652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    is_complete = ClangASTType(m_ast, pointee_qual_type).GetCompleteType();
85752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (is_complete)
85852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        success = cxx_record_decl->isDynamicClass();
85952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    else
86052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        success = false;
86152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
86252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
86352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
86452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (success)
86552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
86652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (dynamic_pointee_type)
86752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type);
86852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                return true;
86952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
87052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
87152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
87252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
87352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
87452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::Type::ObjCObject:
87552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::Type::ObjCInterface:
87652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (check_objc)
87752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
87852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (dynamic_pointee_type)
87952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type);
88052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return true;
88152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
88252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
88352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
88452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                default:
88552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
88652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
88752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
88852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
88952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (dynamic_pointee_type)
89052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        dynamic_pointee_type->Clear();
89152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
89252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
89352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
89452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
89552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
89652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsScalarType () const
89752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
89852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
89952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
90052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
90152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return (GetTypeInfo (NULL) & eTypeIsScalar) != 0;
90252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
90352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
90452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
90552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsTypedefType () const
90652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
90752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
90852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
90952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetQualType()->getTypeClass() == clang::Type::Typedef;
91052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
91152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
91252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
91352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsVoidType () const
91452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
91552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
91652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
91752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetCanonicalQualType()->isVoidType();
91852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
91952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
92052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
92152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPointerToScalarType () const
92252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
92352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
92452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
92552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
92652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return IsPointerType() && GetPointeeType().IsScalarType();
92752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
92852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
92952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
93052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsArrayOfScalarType () const
93152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
93252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType element_type;
93352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsArrayType(&element_type, NULL, NULL))
93452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return element_type.IsScalarType();
93552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
93652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
93752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
93852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
93952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
94052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetCXXClassName (std::string &class_name) const
94152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
94252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
94352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
94452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
94552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
94652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
94752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (cxx_record_decl)
94852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
94952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
95052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
95152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
95252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
95352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    class_name.clear();
95452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
95552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
95652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
95752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
95852f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
95952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCXXClassType () const
96052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
96152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
96252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
96352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
96452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
96552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (qual_type->getAsCXXRecordDecl() != NULL)
96652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return true;
96752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
96852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
96952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
97052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
97152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsBeingDefined () const
97252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
97352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
97452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
97552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
97652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
97752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (tag_type)
97852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return tag_type->isBeingDefined();
97952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
98052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
98152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
98252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
98352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCObjectPointerType (ClangASTType *class_type_ptr)
98452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
98552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
98652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
98752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
98852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
98952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
99052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (qual_type->isObjCObjectPointerType())
99152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
99252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (class_type_ptr)
99352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
99452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (!qual_type->isObjCClassType() &&
99552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                !qual_type->isObjCIdType())
99652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
99752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
99852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (obj_pointer_type == NULL)
99952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    class_type_ptr->Clear();
100052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
100152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    class_type_ptr->SetClangType (m_ast, QualType(obj_pointer_type->getInterfaceType(), 0));
100252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
100352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
100452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return true;
100552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
100652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (class_type_ptr)
100752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        class_type_ptr->Clear();
100852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
100952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
101052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
101152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
101252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetObjCClassName (std::string &class_name)
101352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
101452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
101552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
101652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
101752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
101852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
101952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(qual_type);
102052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (object_type)
102152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
102252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const ObjCInterfaceDecl *interface = object_type->getInterface();
102352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (interface)
102452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
102552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            class_name = interface->getNameAsString();
102652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
102752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
102852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
102952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
103052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
103152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
103252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
103352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
103452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Type Completion
103552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
103652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
103752f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
103852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetCompleteType () const
103952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
104052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
104152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
104252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const bool allow_completion = true;
104352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetCompleteQualType (m_ast, GetQualType(), allow_completion);
104452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
104552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
104652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
104752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// AST related queries
104852f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
104952f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t
105052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetPointerByteSize () const
105152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
105252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_ast)
105352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_ast->getTypeSize(m_ast->VoidPtrTy) / 8;
105452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
105552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
105652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
105752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonConstString
105852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetConstQualifiedTypeName () const
105952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
106052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetConstTypeName ();
106152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
106252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
106352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonConstString
106452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetConstTypeName () const
106552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
106652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
106752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
106852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        std::string type_name (GetTypeName());
106952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!type_name.empty())
107052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ConstString (type_name.c_str());
107152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
107252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ConstString("<invalid>");
107352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
107452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
107552f792329be5db8e38961350589e97e8f2823acdGreg Claytonstd::string
107652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeName () const
107752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
107852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::string type_name;
107952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
108052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
108152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        PrintingPolicy printing_policy (m_ast->getPrintingPolicy());
108252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetQualType());
108352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        printing_policy.SuppressTagKeyword = true;
108452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        printing_policy.LangOpts.WChar = true;
108552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
108652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (typedef_type)
108752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
108852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const TypedefNameDecl *typedef_decl = typedef_type->getDecl();
108952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            type_name = typedef_decl->getQualifiedNameAsString(printing_policy);
109052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
109152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else
109252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
109352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            type_name = qual_type.getAsString(printing_policy);
109452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
109552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
109652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return type_name;
109752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
109852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
109952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
110052f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
110152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeInfo (ClangASTType *pointee_or_element_clang_type) const
110252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
110352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
110452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
110552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
110652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (pointee_or_element_clang_type)
110752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        pointee_or_element_clang_type->Clear();
110852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
110952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetQualType());
111052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
111152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
111252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
111352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
111452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:
111552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
111652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
111752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
111852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
111952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (builtin_type->getKind())
112052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
112152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCId:
112252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCClass:
112352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (pointee_or_element_clang_type)
112452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        pointee_or_element_clang_type->SetClangType(m_ast, m_ast->ObjCBuiltinClassTy);
112552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
112652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
112752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
112852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCSel:
112952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (pointee_or_element_clang_type)
113052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        pointee_or_element_clang_type->SetClangType(m_ast, m_ast->CharTy);
113152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
113252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
113352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
113452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Bool:
113552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char_U:
113652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UChar:
113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::WChar_U:
113852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char16:
113952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char32:
114052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UShort:
114152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UInt:
114252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ULong:
114352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ULongLong:
114452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UInt128:
114552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char_S:
114652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::SChar:
114752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::WChar_S:
114852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Short:
114952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Int:
115052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Long:
115152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::LongLong:
115252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Int128:
115352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Float:
115452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Double:
115552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::LongDouble:
115652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    builtin_type_flags |= eTypeIsScalar;
115752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (builtin_type->isInteger())
115852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
115952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        builtin_type_flags |= eTypeIsInteger;
116052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (builtin_type->isSignedInteger())
116152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            builtin_type_flags |= eTypeIsSigned;
116252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
116352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    else if (builtin_type->isFloatingPoint())
116452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        builtin_type_flags |= eTypeIsFloat;
116552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
116652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                default:
116752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
116852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
116952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return builtin_type_flags;
117052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
117152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
117252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::BlockPointer:
117352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (pointee_or_element_clang_type)
117452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType());
117552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
117652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
117752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Complex:
117852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
117952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
118052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ComplexType *complex_type = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal());
118152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (complex_type)
118252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
118352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                QualType complex_element_type (complex_type->getElementType());
118452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (complex_element_type->isIntegerType())
118552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    complex_type_flags |= eTypeIsFloat;
118652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (complex_element_type->isFloatingType())
118752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    complex_type_flags |= eTypeIsInteger;
118852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
118952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return complex_type_flags;
119052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
119152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
119252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
119352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
119452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedArray:
119552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:
119652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:
119752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (pointee_or_element_clang_type)
119852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_or_element_clang_type->SetClangType(m_ast, cast<ArrayType>(qual_type.getTypePtr())->getElementType());
119952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeHasChildren | eTypeIsArray;
120052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
120152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentName:                    return 0;
120252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
120352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
120452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Decltype:                         return 0;
120552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
120652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:
120752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (pointee_or_element_clang_type)
120852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_or_element_clang_type->SetClangType(m_ast, cast<EnumType>(qual_type)->getDecl()->getIntegerType());
120952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeIsEnumeration | eTypeHasValue;
121052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
121152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
121252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
121352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
121452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
121552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
121652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
121752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
121852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::InjectedClassName:                return 0;
121952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
122052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:
122152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:
122252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (pointee_or_element_clang_type)
122352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_or_element_clang_type->SetClangType(m_ast, cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType());
122452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
122552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
122652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
122752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
122852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
122952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (pointee_or_element_clang_type)
123052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType());
123152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
123252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
123352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
123452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
123552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
123652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:
123752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (pointee_or_element_clang_type)
123852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType());
123952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
124052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
124152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
124252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (qual_type->getAsCXXRecordDecl())
124352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
124452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
124552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return eTypeHasChildren | eTypeIsStructUnion;
124652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
124752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
124852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
124952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
125052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
125152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
125252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return eTypeIsTypedef | ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTypeInfo (pointee_or_element_clang_type);
125352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOfExpr:                       return 0;
125452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOf:                           return 0;
125552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnresolvedUsing:                  return 0;
125652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
125752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:
125852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:
125952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
126052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
126152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const VectorType *vector_type = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal());
126252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (vector_type)
126352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
126452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (vector_type->isIntegerType())
126552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    vector_type_flags |= eTypeIsFloat;
126652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (vector_type->isFloatingType())
126752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    vector_type_flags |= eTypeIsInteger;
126852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
126952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return vector_type_flags;
127052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
127152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:                                            return 0;
127252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
127352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
127452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
127552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
127652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
127752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
127852f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::LanguageType
127952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetMinimumLanguage ()
128052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
128152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
128252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return lldb::eLanguageTypeC;
128352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
128452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // If the type is a reference, then resolve it to what it refers to first:
128552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType().getNonReferenceType());
128652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (qual_type->isAnyPointerType())
128752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
128852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (qual_type->isObjCObjectPointerType())
128952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeObjC;
129052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
129152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType pointee_type (qual_type->getPointeeType());
129252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (pointee_type->getPointeeCXXRecordDecl() != NULL)
129352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeC_plus_plus;
129452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (pointee_type->isObjCObjectOrInterfaceType())
129552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeObjC;
129652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (pointee_type->isObjCClassType())
129752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeObjC;
129852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (pointee_type.getTypePtr() == m_ast->ObjCBuiltinIdTy.getTypePtr())
129952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeObjC;
130052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
130152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
130252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
130352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
130452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeObjC;
130552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (qual_type->getAsCXXRecordDecl())
130652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eLanguageTypeC_plus_plus;
130752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (qual_type->getTypeClass())
130852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
130952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
131052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
131152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Builtin:
131252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (cast<BuiltinType>(qual_type)->getKind())
131352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
131452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                default:
131552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Void:
131652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Bool:
131752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Char_U:
131852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::UChar:
131952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::WChar_U:
132052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Char16:
132152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Char32:
132252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::UShort:
132352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::UInt:
132452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::ULong:
132552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::ULongLong:
132652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::UInt128:
132752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Char_S:
132852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::SChar:
132952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::WChar_S:
133052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Short:
133152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Int:
133252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Long:
133352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::LongLong:
133452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Int128:
133552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Float:
133652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Double:
133752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::LongDouble:
133852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
133952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
134052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::NullPtr:
134152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return eLanguageTypeC_plus_plus;
134252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
134352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::ObjCId:
134452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::ObjCClass:
134552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::ObjCSel:
134652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return eLanguageTypeObjC;
134752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
134852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Dependent:
134952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::Overload:
135052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::BoundMember:
135152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case BuiltinType::UnknownAny:
135252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    break;
135352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
135452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
135552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
135652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
135752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
135852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
135952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return lldb::eLanguageTypeC;
136052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
136152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
136252f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::TypeClass
136352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeClass () const
136452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
136552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
136652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return lldb::eTypeClassInvalid;
136752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
136852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetQualType());
136952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
137052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (qual_type->getTypeClass())
1371d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
1372d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::UnaryTransform:           break;
1373d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::FunctionNoProto:          return lldb::eTypeClassFunction;
1374d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::FunctionProto:            return lldb::eTypeClassFunction;
1375d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::IncompleteArray:          return lldb::eTypeClassArray;
1376d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::VariableArray:            return lldb::eTypeClassArray;
1377d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::ConstantArray:            return lldb::eTypeClassArray;
1378d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::DependentSizedArray:      return lldb::eTypeClassArray;
1379d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::DependentSizedExtVector:  return lldb::eTypeClassVector;
1380d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::ExtVector:                return lldb::eTypeClassVector;
1381d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::Vector:                   return lldb::eTypeClassVector;
1382d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::Builtin:                  return lldb::eTypeClassBuiltin;
1383d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::ObjCObjectPointer:        return lldb::eTypeClassObjCObjectPointer;
1384d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::BlockPointer:             return lldb::eTypeClassBlockPointer;
1385d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::Pointer:                  return lldb::eTypeClassPointer;
1386d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::LValueReference:          return lldb::eTypeClassReference;
1387d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::RValueReference:          return lldb::eTypeClassReference;
1388d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::MemberPointer:            return lldb::eTypeClassMemberPointer;
1389d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::Complex:
1390d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton            if (qual_type->isComplexType())
139152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return lldb::eTypeClassComplexFloat;
139252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
139352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return lldb::eTypeClassComplexInteger;
139452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:               return lldb::eTypeClassObjCObject;
139552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:            return lldb::eTypeClassObjCInterface;
139652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
139752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
139852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
139952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordDecl *record_decl = record_type->getDecl();
140052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (record_decl->isUnion())
140152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return lldb::eTypeClassUnion;
140252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (record_decl->isStruct())
140352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return lldb::eTypeClassStruct;
140452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
140552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return lldb::eTypeClassClass;
140652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
140752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
140852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:                     return lldb::eTypeClassEnumeration;
140952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:                  return lldb::eTypeClassTypedef;
141052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnresolvedUsing:          break;
141152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
141252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).GetTypeClass();
141352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
141452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
141552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
141652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Attributed:               break;
141752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateTypeParm:         break;
141852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParm:    break;
141952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParmPack:break;
142052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Auto:                     break;
142152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::InjectedClassName:        break;
142252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentName:            break;
142352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentTemplateSpecialization: break;
142452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::PackExpansion:            break;
142552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
142652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOfExpr:               break;
142752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOf:                   break;
142852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Decltype:                 break;
142952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateSpecialization:   break;
143052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Atomic:                   break;
143152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
143252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // We don't know hot to display this type...
143352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return lldb::eTypeClassOther;
143452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
143552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
143652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
143752f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid
143852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetClangType (clang::ASTContext *ast, clang::QualType qual_type)
143952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
144052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_ast = ast;
144152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_type = qual_type.getAsOpaquePtr();
144252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
144352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
144452f792329be5db8e38961350589e97e8f2823acdGreg Claytonunsigned
144552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeQualifiers() const
144652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
144752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
144852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return GetQualType().getQualifiers().getCVRQualifiers();
144952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
145052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
145152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
145252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
145352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Creating related types
145452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
145552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
145652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
145752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddConstModifier () const
145852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
145952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_type)
146052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
146152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType result(GetQualType());
146252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        result.addConst();
146352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, result);
146452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
146552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
146652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
146752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
146852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
146952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddRestrictModifier () const
147052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
147152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_type)
147252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
147352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType result(GetQualType());
147452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        result.getQualifiers().setRestrict (true);
147552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, result);
147652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
147752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
147852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
147952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
148052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
148152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddVolatileModifier () const
148252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
148352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_type)
148452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
148552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType result(GetQualType());
148652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        result.getQualifiers().setVolatile (true);
148752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, result);
148852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
148952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
149052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
149152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
149252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
149352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetArrayElementType (uint64_t& stride) const
149452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
149552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
149652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
149752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetCanonicalQualType());
149852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
149952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType element_type (m_ast, qual_type.getTypePtr()->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
150052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
150152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        // TODO: the real stride will be >= this value.. find the real one!
150252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        stride = element_type.GetByteSize();
150352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
150452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return element_type;
150552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
150652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
150752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
150852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
150952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
151052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
151152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetCanonicalType () const
151252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
151352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
151452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, GetCanonicalQualType());
151552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
151652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
151752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
151852f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic QualType
151952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetFullyUnqualifiedType_Impl (ASTContext *ast, QualType qual_type)
152052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
152152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (qual_type->isPointerType())
152252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
152352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
152452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        qual_type = qual_type.getUnqualifiedType();
152552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    qual_type.removeLocalConst();
152652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    qual_type.removeLocalRestrict();
152752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    qual_type.removeLocalVolatile();
152852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return qual_type;
152952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
153052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
153152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
153252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFullyUnqualifiedType () const
153352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
153452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
153552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType(m_ast, GetFullyUnqualifiedType_Impl(m_ast, GetQualType()));
153652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
153752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
153852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
153952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
154052f792329be5db8e38961350589e97e8f2823acdGreg Claytonint
154152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFunctionArgumentCount () const
154252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
154352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
154452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
154552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const FunctionProtoType* func = dyn_cast<FunctionProtoType>(GetCanonicalQualType());
154652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (func)
154752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return func->getNumArgs();
154852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
154952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return -1;
155052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
155152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
155252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
155352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFunctionArgumentTypeAtIndex (size_t idx)
155452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
155552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
155652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
155752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const FunctionProtoType* func = dyn_cast<FunctionProtoType>(GetCanonicalQualType());
155852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (func)
155952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
156052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const uint32_t num_args = func->getNumArgs();
156152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx < num_args)
156252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, func->getArgType(idx));
156352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
156452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
156552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
156652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
156752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
156852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
156952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFunctionReturnType () const
157052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
157152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
157252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
157352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetCanonicalQualType());
157452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const FunctionProtoType* func = dyn_cast<FunctionProtoType>(qual_type.getTypePtr());
157552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (func)
157652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, func->getResultType());
157752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
157852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
157952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
158052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
158152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
158252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
158352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetLValueReferenceType () const
158452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
158552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
158652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
158752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType(m_ast, m_ast->getLValueReferenceType(GetQualType()));
158852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
158952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
159052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
159152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
159252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
159352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetRValueReferenceType () const
159452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
159552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
159652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
159752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType(m_ast, m_ast->getRValueReferenceType(GetQualType()));
159852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
159952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
160052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
160152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
160252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
160352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNonReferenceType () const
160452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
160552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
160652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType(m_ast, GetQualType().getNonReferenceType());
160752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
160852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
160952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
161052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
161152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CreateTypedefType (const char *typedef_name,
161252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                 clang::DeclContext *decl_ctx) const
161352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
161452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid() && typedef_name && typedef_name[0])
161552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
161652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetQualType());
161752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (decl_ctx == NULL)
161852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            decl_ctx = m_ast->getTranslationUnitDecl();
161952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        TypedefDecl *decl = TypedefDecl::Create (*m_ast,
162052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 decl_ctx,
162152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 SourceLocation(),
162252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 SourceLocation(),
162352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 &m_ast->Idents.get(typedef_name),
162452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 m_ast->getTrivialTypeSourceInfo(qual_type));
162552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
162652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        decl->setAccess(AS_public); // TODO respect proper access specifier
162752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
162852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        // Get a uniqued QualType for the typedef decl type
162952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, m_ast->getTypedefType (decl));
163052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
163152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
163252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
163352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
163452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
163552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
163652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetPointeeType () const
163752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
163852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_type)
163952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
164052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetQualType());
164152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, qual_type.getTypePtr()->getPointeeType());
164252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
164352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
164452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
164552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
164652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
164752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetPointerType () const
164852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
164952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
165052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
165152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetQualType());
165252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
165352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
165452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
165552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
165652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObject:
165752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCInterface:
165852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, m_ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr());
165952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
166052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
166152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType(m_ast, m_ast->getPointerType(qual_type).getAsOpaquePtr());
166252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
166352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
166452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
166552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
166652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
166752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
166852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypedefedType () const
166952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
167052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
167152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
167252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const TypedefType *typedef_type = dyn_cast<TypedefType>(GetQualType());
167352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (typedef_type)
167452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, typedef_type->getDecl()->getUnderlyingType());
167552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
167652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
167752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
167852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
167952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
168052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::RemoveFastQualifiers () const
168152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
168252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_type)
168352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
168452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetQualType());
168552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        qual_type.getQualifiers().removeFastQualifiers();
168652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, qual_type);
168752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
168852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
168952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
169052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
169152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
169252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
169352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Create related types using the current type's AST
169452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
169552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
169652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
169752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetBasicTypeFromAST (lldb::BasicType basic_type) const
169852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
169952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
170052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTContext::GetBasicType(m_ast, basic_type);
170152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
170252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
170352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
170452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Exploring the type
170552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
170652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
170752f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint64_t
170852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetBitSize () const
170952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
171052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (GetCompleteType ())
171152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
171252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetCanonicalQualType());
171352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const uint32_t bit_size = m_ast->getTypeSize (qual_type);
171452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (bit_size == 0)
171552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
171652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (qual_type->isIncompleteArrayType())
171752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return m_ast->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
171852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
171952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
172052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return bit_size + m_ast->getTypeSize(m_ast->ObjCBuiltinClassTy);
172152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return bit_size;
172252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
172352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
172452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
172552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
172652f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint64_t
172752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetByteSize () const
172852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
172952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return (GetBitSize () + 7) / 8;
173052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
173152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
173252f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t
173352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeBitAlign () const
173452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
173552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (GetCompleteType ())
173652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return m_ast->getTypeAlign(GetQualType());
173752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
173852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
173952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
174052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
174152f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::Encoding
174252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetEncoding (uint64_t &count) const
174352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
174452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
174552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return lldb::eEncodingInvalid;
174652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
174752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    count = 1;
174852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
174952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
175052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (qual_type->getTypeClass())
175152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
175252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnaryTransform:
175352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
175452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
175552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionNoProto:
175652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionProto:
175752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
175852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
175952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:
176052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:
176152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
176252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
176352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
176452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
176552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
176652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:
176752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:
176852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // TODO: Set this to more than one???
176952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
177052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
177152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:
177252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (cast<BuiltinType>(qual_type)->getKind())
177352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
177452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default: assert(0 && "Unknown builtin type!");
177552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Void:
177652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
177752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
177852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Bool:
177952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char_S:
178052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::SChar:
178152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::WChar_S:
178252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char16:
178352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char32:
178452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Short:
178552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Int:
178652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Long:
178752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::LongLong:
178852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Int128:        return lldb::eEncodingSint;
178952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
179052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char_U:
179152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UChar:
179252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::WChar_U:
179352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UShort:
179452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UInt:
179552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ULong:
179652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ULongLong:
179752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UInt128:       return lldb::eEncodingUint;
179852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
179952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Float:
180052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Double:
180152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::LongDouble:    return lldb::eEncodingIEEE754;
180252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
180352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCClass:
180452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCId:
180552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCSel:       return lldb::eEncodingUint;
180652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
180752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::NullPtr:       return lldb::eEncodingUint;
180852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
180952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
181052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // All pointer types are represented as unsigned integer encodings.
181152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // We may nee to add a eEncodingPointer if we ever need to know the
181252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // difference
181352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
181452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::BlockPointer:
181552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:
181652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:
181752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:
181852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::MemberPointer:            return lldb::eEncodingUint;
181952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Complex:
182052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
182152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            lldb::Encoding encoding = lldb::eEncodingIEEE754;
182252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (qual_type->isComplexType())
182352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                encoding = lldb::eEncodingIEEE754;
182452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
182552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
182652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ComplexType *complex_type = qual_type->getAsComplexIntegerType();
182752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (complex_type)
182852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    encoding = ClangASTType(m_ast, complex_type->getElementType()).GetEncoding(count);
182952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
183052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    encoding = lldb::eEncodingSint;
183152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
183252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = 2;
183352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return encoding;
183452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
183552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
183652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:            break;
183752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:                   break;
183852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:                     return lldb::eEncodingSint;
183952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
184052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
184152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
184252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
184352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
184452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
184552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
184652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).GetEncoding(count);
184752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
184852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedArray:
184952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedExtVector:
185052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnresolvedUsing:
185152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Attributed:
185252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateTypeParm:
185352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParm:
185452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParmPack:
185552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Auto:
185652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::InjectedClassName:
185752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentName:
185852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentTemplateSpecialization:
185952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::PackExpansion:
186052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
186152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
186252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOfExpr:
186352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOf:
186452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Decltype:
186552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateSpecialization:
186652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Atomic:
186752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
186852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
186952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
187052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    count = 0;
187152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return lldb::eEncodingInvalid;
187252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
187352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
187452f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::Format
187552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFormat () const
187652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
187752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
187852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return lldb::eFormatDefault;
187952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
188052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
188152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
188252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (qual_type->getTypeClass())
188352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
188452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnaryTransform:
188552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
188652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
188752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionNoProto:
188852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionProto:
188952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
189052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
189152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:
189252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:
189352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
189452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
189552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
189652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return lldb::eFormatVoid; // no value
189752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
189852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:
189952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:
190052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
190152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
190252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:
190352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (cast<BuiltinType>(qual_type)->getKind())
190452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
190552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //default: assert(0 && "Unknown builtin type!");
190652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UnknownAny:
190752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Void:
190852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::BoundMember:
190952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
191052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
191152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Bool:          return lldb::eFormatBoolean;
191252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char_S:
191352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::SChar:
191452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::WChar_S:
191552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char_U:
191652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UChar:
191752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::WChar_U:       return lldb::eFormatChar;
191852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char16:        return lldb::eFormatUnicode16;
191952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Char32:        return lldb::eFormatUnicode32;
192052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UShort:        return lldb::eFormatUnsigned;
192152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Short:         return lldb::eFormatDecimal;
192252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UInt:          return lldb::eFormatUnsigned;
192352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Int:           return lldb::eFormatDecimal;
192452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ULong:         return lldb::eFormatUnsigned;
192552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Long:          return lldb::eFormatDecimal;
192652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ULongLong:     return lldb::eFormatUnsigned;
192752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::LongLong:      return lldb::eFormatDecimal;
192852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::UInt128:       return lldb::eFormatUnsigned;
192952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Int128:        return lldb::eFormatDecimal;
193052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Float:         return lldb::eFormatFloat;
193152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Double:        return lldb::eFormatFloat;
193252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::LongDouble:    return lldb::eFormatFloat;
193352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::NullPtr:
193452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Overload:
193552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Dependent:
193652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCId:
193752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCClass:
193852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCSel:
193952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::Half:
194052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ARCUnbridgedCast:
194152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::PseudoObject:
194252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::BuiltinFn:
194352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLEvent:
194452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLImage1d:
194552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLImage1dArray:
194652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLImage1dBuffer:
194752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLImage2d:
194852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLImage2dArray:
194952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLImage3d:
195052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::OCLSampler:
195152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return lldb::eFormatHex;
195252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
195352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
195452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:        return lldb::eFormatHex;
195552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::BlockPointer:             return lldb::eFormatHex;
195652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:                  return lldb::eFormatHex;
195752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:
195852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:          return lldb::eFormatHex;
195952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::MemberPointer:            break;
196052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Complex:
196152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
196252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (qual_type->isComplexType())
196352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return lldb::eFormatComplex;
196452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
196552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return lldb::eFormatComplexInteger;
196652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
196752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:            break;
196852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:                   break;
196952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:                     return lldb::eFormatEnum;
197052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
197152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
197252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Auto:
197352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<AutoType>(qual_type)->desugar()).GetFormat();
197452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
197552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetFormat();
197652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
197752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetFormat();
197852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedArray:
197952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedExtVector:
198052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnresolvedUsing:
198152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Attributed:
198252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateTypeParm:
198352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParm:
198452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParmPack:
198552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::InjectedClassName:
198652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentName:
198752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentTemplateSpecialization:
198852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::PackExpansion:
198952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
199052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
199152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOfExpr:
199252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOf:
199352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Decltype:
199452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateSpecialization:
199552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Atomic:
199652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
199752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
199852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // We don't know hot to display this type...
199952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return lldb::eFormatBytes;
200052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
200152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
200252f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic bool
200352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
200452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
200552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    while (class_interface_decl)
200652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
200752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (class_interface_decl->ivar_size() > 0)
200852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
200952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
201052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (check_superclass)
201152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
201252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else
201352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
201452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
201552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
201652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
201752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
201852f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
201952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumChildren (bool omit_empty_base_classes) const
202052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
202152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
202252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
202352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
202452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t num_children = 0;
202552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetQualType());
202652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
202752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
202852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
202952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:
203052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (cast<BuiltinType>(qual_type)->getKind())
203152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
203252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCId:    // child is Class
203352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case BuiltinType::ObjCClass: // child is Class
203452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = 1;
203552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
203652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
203752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
203852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
203952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
204052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
204152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
204252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Complex: return 0;
204352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
204452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
204552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteQualType (m_ast, qual_type))
204652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
204752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
204852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordDecl *record_decl = record_type->getDecl();
204952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                assert(record_decl);
205052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
205152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (cxx_record_decl)
205252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
205352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (omit_empty_base_classes)
205452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
205552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Check each base classes to see if it or any of its
205652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // base classes contain any fields. This can help
205752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // limit the noise in variable views by not having to
205852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // show base classes that contain no members.
205952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
206052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
206152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             base_class != base_class_end;
206252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             ++base_class)
206352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
206452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
206552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
206652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            // Skip empty base classes
206752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (ClangASTContext::RecordHasFields(base_class_decl) == false)
206852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                continue;
206952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
207052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            num_children++;
207152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
207252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
207352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    else
207452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
207552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Include all base classes
207652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        num_children += cxx_record_decl->getNumBases();
207752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
207852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
207952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
208052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                RecordDecl::field_iterator field, field_end;
208152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
208252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ++num_children;
208352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
208452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
208552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
208652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
208752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
208852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteQualType (m_ast, qual_type))
208952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
209052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
209152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                assert (objc_class_type);
209252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
209352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
209452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
209552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
209652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl)
209752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
209852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
209952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
210052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (superclass_interface_decl)
210152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
210252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (omit_empty_base_classes)
210352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
210452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (ObjCDeclHasIVars (superclass_interface_decl, true))
210552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    ++num_children;
210652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
210752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            else
210852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ++num_children;
210952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
211052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
211152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        num_children += class_interface_decl->ivar_size();
211252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
211352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
211452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
211552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
211652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
211752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
211852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
211952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
212052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType pointee_type = pointer_type->getPointeeType();
212152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t num_pointee_children = ClangASTType (m_ast,pointee_type).GetNumChildren (omit_empty_base_classes);
212252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // If this type points to a simple type, then it has 1 child
212352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (num_pointee_children == 0)
212452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = 1;
212552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
212652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = num_pointee_children;
212752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
212852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
212952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
213052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:
213152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:
213252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            num_children = cast<VectorType>(qual_type.getTypePtr())->getNumElements();
213352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
213452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
213552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
213652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
213752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
213852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
213952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:
214052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
214152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
214252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType pointee_type (pointer_type->getPointeeType());
214352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t num_pointee_children = ClangASTType (m_ast,pointee_type).GetNumChildren (omit_empty_base_classes);
214452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (num_pointee_children == 0)
214552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
214652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // We have a pointer to a pointee type that claims it has no children.
214752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // We will want to look at
214852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = ClangASTType (m_ast, pointee_type).GetNumPointeeChildren();
214952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
215052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
215152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = num_pointee_children;
215252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
215352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
215452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
215552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:
215652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:
215752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
215852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
215952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
216052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t num_pointee_children = ClangASTType (m_ast, pointee_type).GetNumChildren (omit_empty_base_classes);
216152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // If this type points to a simple type, then it has 1 child
216252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (num_pointee_children == 0)
216352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = 1;
216452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
216552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                num_children = num_pointee_children;
216652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
216752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
216852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
216952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
217052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
217152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            num_children = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
217252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
217352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
217452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
217552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            num_children = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
217652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
217752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
217852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
217952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            num_children = ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
218052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
218152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
218252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
218352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
218452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return num_children;
218552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
218652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
218752f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::BasicType
218852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetBasicTypeEnumeration () const
218952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
219052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
219152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
219252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetQualType());
219352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
219452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (type_class == clang::Type::Builtin)
219552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
219652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (cast<clang::BuiltinType>(qual_type)->getKind())
219752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
219852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Void:      return eBasicTypeVoid;
219952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Bool:      return eBasicTypeBool;
220052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char_S:    return eBasicTypeSignedChar;
220152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char_U:    return eBasicTypeUnsignedChar;
220252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char16:    return eBasicTypeChar16;
220352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Char32:    return eBasicTypeChar32;
220452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UChar:     return eBasicTypeUnsignedChar;
220552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::SChar:     return eBasicTypeSignedChar;
220652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::WChar_S:   return eBasicTypeSignedWChar;
220752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::WChar_U:   return eBasicTypeUnsignedWChar;
220852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Short:     return eBasicTypeShort;
220952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UShort:    return eBasicTypeUnsignedShort;
221052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Int:       return eBasicTypeInt;
221152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UInt:      return eBasicTypeUnsignedInt;
221252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Long:      return eBasicTypeLong;
221352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ULong:     return eBasicTypeUnsignedLong;
221452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::LongLong:  return eBasicTypeLongLong;
221552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
221652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Int128:    return eBasicTypeInt128;
221752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UInt128:   return eBasicTypeUnsignedInt128;
221852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
221952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Half:      return eBasicTypeHalf;
222052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Float:     return eBasicTypeFloat;
222152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Double:    return eBasicTypeDouble;
222252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
222352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
222452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::NullPtr:   return eBasicTypeNullPtr;
222552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCId:    return eBasicTypeObjCID;
222652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
222752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ObjCSel:   return eBasicTypeObjCSel;
222852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Dependent:
222952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::Overload:
223052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::BoundMember:
223152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::PseudoObject:
223252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::UnknownAny:
223352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::BuiltinFn:
223452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::ARCUnbridgedCast:
223552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLEvent:
223652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLImage1d:
223752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLImage1dArray:
223852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLImage1dBuffer:
223952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLImage2d:
224052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLImage2dArray:
224152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLImage3d:
224252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                case clang::BuiltinType::OCLSampler:
224352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return eBasicTypeOther;
224452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
224552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
224652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
224752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return eBasicTypeInvalid;
224852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
224952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
225052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
225152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark Aggregate Types
225252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
225352f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
225452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumDirectBaseClasses () const
225552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
225652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
225752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
225852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
225952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t count = 0;
226052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
226152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
226252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
226352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
226452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
226552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
226652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
226752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
226852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (cxx_record_decl)
226952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    count = cxx_record_decl->getNumBases();
227052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
227152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
227252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
227352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
227452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
227552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
227652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
227752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
227852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
227952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
228052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl && class_interface_decl->getSuperClass())
228152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        count = 1;
228252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
228352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
228452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
228552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
228652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
228752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
228852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
228952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
229052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
229152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
229252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
229352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
229452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
229552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl && class_interface_decl->getSuperClass())
229652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        count = 1;
229752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
229852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
229952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
230052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
230152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
230252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
230352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumDirectBaseClasses ();
230452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
230552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
230652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
230752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumDirectBaseClasses ();
230852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
230952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
231052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
231152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumDirectBaseClasses ();
231252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
231352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
231452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
231552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
231652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return count;
231752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
231852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
231952f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
232052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumVirtualBaseClasses () const
232152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
232252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
232352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
232452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
232552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t count = 0;
232652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
232752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
232852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
232952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
233052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
233152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
233252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
233352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
233452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (cxx_record_decl)
233552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    count = cxx_record_decl->getNumVBases();
233652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
233752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
233852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
233952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
234052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumVirtualBaseClasses();
234152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
234252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
234352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
234452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumVirtualBaseClasses();
234552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
234652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
234752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
234852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumVirtualBaseClasses();
234952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
235052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
235152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
235252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
235352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
235452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return count;
235552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
235652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
235752f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
235852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumFields () const
235952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
236052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
236152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
236252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
236352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t count = 0;
236452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
236552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
236652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
236752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
236852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
236952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
237052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
237152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
237252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (record_type)
237352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
237452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    RecordDecl *record_decl = record_type->getDecl();
237552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (record_decl)
237652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
237752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        uint32_t field_idx = 0;
237852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        RecordDecl::field_iterator field, field_end;
237952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
238052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ++field_idx;
238152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        count = field_idx;
238252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
238352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
238452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
238552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
238652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
238752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
238852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
238952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
239052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
239152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
239252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
239352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
239452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
239552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
239652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            count = ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
239752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
239852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
239952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
240052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
240152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
240252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
240352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
240452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
240552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
240652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
240752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl)
240852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        count = class_interface_decl->ivar_size();
240952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
241052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
241152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
241252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
241352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
241452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
241552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
241652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
241752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
241852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
241952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
242052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
242152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
242252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl)
242352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        count = class_interface_decl->ivar_size();
242452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
242552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
242652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
242752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
242852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
242952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
243052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
243152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return count;
243252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
243352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
243452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
243552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetDirectBaseClassAtIndex (size_t idx, uint32_t *bit_offset_ptr) const
243652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
243752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
243852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType();
243952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
244052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
244152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
244252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
244352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
244452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
244552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
244652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
244752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
244852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (cxx_record_decl)
244952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
245052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    uint32_t curr_idx = 0;
245152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
245252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
245352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         base_class != base_class_end;
245452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         ++base_class, ++curr_idx)
245552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
245652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (curr_idx == idx)
245752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
245852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (bit_offset_ptr)
245952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
246052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(cxx_record_decl);
246152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
246252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (base_class->isVirtual())
246352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
246452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                else
246552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
246652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
246752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (m_ast, base_class->getType());
246852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
246952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
247052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
247152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
247252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
247352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
247452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
247552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx == 0 && GetCompleteType())
247652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
247752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
247852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
247952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
248052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
248152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl)
248252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
248352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
248452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (superclass_interface_decl)
248552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
248652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (bit_offset_ptr)
248752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                *bit_offset_ptr = 0;
248852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
248952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
249052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
249152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
249252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
249352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
249452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
249552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
249652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
249752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx == 0 && GetCompleteType())
249852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
249952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
250052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
250152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
250252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
250352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
250452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl)
250552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
250652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
250752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (superclass_interface_decl)
250852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
250952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (bit_offset_ptr)
251052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                *bit_offset_ptr = 0;
251152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
251252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
251352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
251452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
251552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
251652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
251752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
251852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
251952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
252052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr);
252152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
252252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
252352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr);
252452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
252552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
252652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr);
252752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
252852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
252952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
253052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
253152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
253252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
253352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
253452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
253552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetVirtualBaseClassAtIndex (size_t idx, uint32_t *bit_offset_ptr) const
253652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
253752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
253852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType();
253952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
254052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
254152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
254252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
254352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
254452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
254552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
254652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
254752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
254852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (cxx_record_decl)
254952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
255052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    uint32_t curr_idx = 0;
255152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
255252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
255352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         base_class != base_class_end;
255452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         ++base_class, ++curr_idx)
255552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
255652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (curr_idx == idx)
255752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
255852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (bit_offset_ptr)
255952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
256052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(cxx_record_decl);
256152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
256252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
256352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
256452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
256552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (m_ast, base_class->getType());
256652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
256752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
256852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
256952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
257052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
257152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
257252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
257352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr);
257452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
257552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
257652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr);
257752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
257852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
257952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return  ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr);
258052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
258152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
258252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
258352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
258452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
258552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
258652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
258752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic clang_type_t
258852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetObjCFieldAtIndex (clang::ASTContext *ast,
258952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     ObjCInterfaceDecl *class_interface_decl,
259052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     size_t idx,
259152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     std::string& name,
259252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     uint64_t *bit_offset_ptr,
259352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     uint32_t *bitfield_bit_size_ptr,
259452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     bool *is_bitfield_ptr)
259552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
259652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (class_interface_decl)
259752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
259852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (idx < (class_interface_decl->ivar_size()))
259952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
260052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
260152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t ivar_idx = 0;
260252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
260352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
260452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
260552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (ivar_idx == idx)
260652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
260752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
260852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
260952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    QualType ivar_qual_type(ivar_decl->getType());
261052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
261152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    name.assign(ivar_decl->getNameAsString());
261252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
261352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (bit_offset_ptr)
261452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
261552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
261652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
261752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
261852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
261952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool is_bitfield = ivar_pos->isBitField();
262052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
262152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (bitfield_bit_size_ptr)
262252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
262352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        *bitfield_bit_size_ptr = 0;
262452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
262552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (is_bitfield && ast)
262652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
262752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
262852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            llvm::APSInt bitfield_apsint;
262952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
263052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
263152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
263252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
263352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
263452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
263552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (is_bitfield_ptr)
263652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        *is_bitfield_ptr = is_bitfield;
263752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
263852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ivar_qual_type.getAsOpaquePtr();
263952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
264052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
264152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
264252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
264352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return NULL;
264452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
264552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
264652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
264752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFieldAtIndex (size_t idx,
264852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               std::string& name,
264952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               uint64_t *bit_offset_ptr,
265052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               uint32_t *bitfield_bit_size_ptr,
265152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               bool *is_bitfield_ptr) const
265252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
265352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
265452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType();
265552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
265652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
265752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
265852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
265952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
266052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
266152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
266252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
266352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
266452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordDecl *record_decl = record_type->getDecl();
266552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                uint32_t field_idx = 0;
266652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                RecordDecl::field_iterator field, field_end;
266752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
266852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
266952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (idx == field_idx)
267052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
267152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Print the member type if requested
267252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Print the member name and equal sign
267352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        name.assign(field->getNameAsString());
267452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
267552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Figure out the type byte size (field_type_info.first) and
267652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // alignment (field_type_info.second) from the AST context.
267752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (bit_offset_ptr)
267852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
267952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl);
268052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
268152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
268252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
268352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const bool is_bitfield = field->isBitField();
268452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
268552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (bitfield_bit_size_ptr)
268652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
268752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            *bitfield_bit_size_ptr = 0;
268852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
268952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (is_bitfield)
269052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
269152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                Expr *bitfield_bit_size_expr = field->getBitWidth();
269252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                llvm::APSInt bitfield_apsint;
269352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *m_ast))
269452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
269552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
269652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
269752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
269852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
269952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (is_bitfield_ptr)
270052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            *is_bitfield_ptr = is_bitfield;
270152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
270252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (m_ast, field->getType());
270352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
270452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
270552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
270652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
270752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
270852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
270952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
271052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
271152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
271252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
271352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
271452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
271552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (m_ast, GetObjCFieldAtIndex(m_ast, class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
271652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
271752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
271852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
271952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
272052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
272152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
272252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (GetCompleteType())
272352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
272452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
272552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                assert (objc_class_type);
272652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
272752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
272852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
272952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (m_ast, GetObjCFieldAtIndex(m_ast, class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
273052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
273152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
273252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
273352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
273452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
273552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
273652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
273752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        GetFieldAtIndex (idx,
273852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         name,
273952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bit_offset_ptr,
274052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bitfield_bit_size_ptr,
274152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         is_bitfield_ptr);
274252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
274352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
274452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).
274552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        GetFieldAtIndex (idx,
274652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         name,
274752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bit_offset_ptr,
274852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bitfield_bit_size_ptr,
274952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         is_bitfield_ptr);
275052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
275152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
275252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).
275352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        GetFieldAtIndex (idx,
275452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         name,
275552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bit_offset_ptr,
275652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bitfield_bit_size_ptr,
275752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         is_bitfield_ptr);
275852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
275952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
276052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
276152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
276252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
276352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
276452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
276552f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
276652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetIndexOfFieldWithName (const char* name,
276752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                       ClangASTType* field_clang_type_ptr,
276852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                       uint64_t *bit_offset_ptr,
276952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                       uint32_t *bitfield_bit_size_ptr,
277052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                       bool *is_bitfield_ptr) const
277152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
277252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    unsigned count = GetNumFields();
277352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::string field_name;
277452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (unsigned index = 0; index < count; index++)
277552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
277652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType field_clang_type (GetFieldAtIndex(index, field_name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
277752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (strcmp(field_name.c_str(), name) == 0)
277852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
277952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (field_clang_type_ptr)
278052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                *field_clang_type_ptr = field_clang_type;
278152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return index;
278252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
278352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
278452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return UINT32_MAX;
278552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
278652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
278752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no
278852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// children, then we either need to trust it, or override it and return a
278952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// different result. For example, an "int *" has one child that is an integer,
279052f792329be5db8e38961350589e97e8f2823acdGreg Clayton// but a function pointer doesn't have any children. Likewise if a Record type
279152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// claims it has no children, then there really is nothing to show.
279252f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
279352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumPointeeChildren () const
279452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
279552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
279652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
279752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
279852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
279952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
280052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
280152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
280252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:
280352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            switch (cast<clang::BuiltinType>(qual_type)->getKind())
280452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
280552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::UnknownAny:
280652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Void:
280752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::NullPtr:
280852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLEvent:
280952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLImage1d:
281052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLImage1dArray:
281152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLImage1dBuffer:
281252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLImage2d:
281352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLImage2dArray:
281452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLImage3d:
281552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::OCLSampler:
281652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return 0;
281752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Bool:
281852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Char_U:
281952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::UChar:
282052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::WChar_U:
282152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Char16:
282252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Char32:
282352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::UShort:
282452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::UInt:
282552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::ULong:
282652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::ULongLong:
282752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::UInt128:
282852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Char_S:
282952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::SChar:
283052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::WChar_S:
283152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Short:
283252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Int:
283352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Long:
283452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::LongLong:
283552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Int128:
283652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Float:
283752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Double:
283852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::LongDouble:
283952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Dependent:
284052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Overload:
284152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::ObjCId:
284252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::ObjCClass:
284352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::ObjCSel:
284452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::BoundMember:
284552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::Half:
284652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::ARCUnbridgedCast:
284752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::PseudoObject:
284852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::BuiltinType::BuiltinFn:
284952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return 1;
285052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
285152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
285252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
285352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Complex:                  return 1;
285452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:                  return 1;
285552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
285652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:          return 1;
285752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:          return 1;
285852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::MemberPointer:            return 0;
285952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:            return 0;
286052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:          return 0;
286152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:            return 0;
286252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedArray:      return 0;
286352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedExtVector:  return 0;
286452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:                   return 0;
286552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:                return 0;
286652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
286752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
286852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnresolvedUsing:          return 0;
286952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:                    return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumPointeeChildren ();
287052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:                  return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumPointeeChildren ();
287152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:               return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumPointeeChildren ();
287252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOfExpr:               return 0;
287352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOf:                   return 0;
287452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Decltype:                 return 0;
287552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:                   return 0;
287652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:                     return 1;
287752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateTypeParm:         return 1;
287852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::SubstTemplateTypeParm:    return 1;
287952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateSpecialization:   return 1;
288052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::InjectedClassName:        return 0;
288152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentName:            return 1;
288252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentTemplateSpecialization:  return 1;
288352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:               return 0;
288452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:            return 0;
288552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:        return 1;
288652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
288752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
288852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
288952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
289052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
289152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
289252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
289352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
289452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
289552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        const char *parent_name,
289652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        size_t idx,
289752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool transparent_pointers,
289852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool omit_empty_base_classes,
289952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool ignore_array_bounds,
290052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        std::string& child_name,
290152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        uint32_t &child_byte_size,
290252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        int32_t &child_byte_offset,
290352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        uint32_t &child_bitfield_bit_size,
290452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        uint32_t &child_bitfield_bit_offset,
290552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool &child_is_base_class,
290652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool &child_is_deref_of_parent) const
290752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
290852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
290952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType();
291052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
291152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType parent_qual_type(GetCanonicalQualType());
291252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
291352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    child_bitfield_bit_size = 0;
291452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    child_bitfield_bit_offset = 0;
291552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    child_is_base_class = false;
291652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
291752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const bool idx_is_valid = idx < GetNumChildren (omit_empty_base_classes);
291852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t bit_offset;
291952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (parent_type_class)
292052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
292152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:
292252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid)
292352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
292452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
292552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
292652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case clang::BuiltinType::ObjCId:
292752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case clang::BuiltinType::ObjCClass:
292852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name = "isa";
292952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = m_ast->getTypeSize(m_ast->ObjCBuiltinClassTy) / CHAR_BIT;
293052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (m_ast, m_ast->ObjCBuiltinClassTy);
293152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
293252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    default:
293352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        break;
293452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
293552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
293652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
293752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
293852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
293952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid && GetCompleteType())
294052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
294152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
294252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordDecl *record_decl = record_type->getDecl();
294352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                assert(record_decl);
294452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl);
294552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                uint32_t child_idx = 0;
294652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
294752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
294852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (cxx_record_decl)
294952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
295052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    // We might have base classes to print out first
295152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
295252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
295352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         base_class != base_class_end;
295452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         ++base_class)
295552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
295652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const CXXRecordDecl *base_class_decl = NULL;
295752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
295852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Skip empty base classes
295952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (omit_empty_base_classes)
296052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
296152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
296252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (ClangASTContext::RecordHasFields(base_class_decl) == false)
296352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                continue;
296452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
296552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
296652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (idx == child_idx)
296752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
296852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (base_class_decl == NULL)
296952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
297052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
297152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
297252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (base_class->isVirtual())
297352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
297452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            else
297552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
297652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
297752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            // Base classes should be a multiple of 8 bits in size
297852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            child_byte_offset = bit_offset/8;
297952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ClangASTType base_class_clang_type(m_ast, base_class->getType());
298052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            child_name = base_class_clang_type.GetTypeName();
298152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize();
298252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
298352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            // Base classes bit sizes should be a multiple of 8 bits in size
298452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            assert (base_class_clang_type_bit_size % 8 == 0);
298552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            child_byte_size = base_class_clang_type_bit_size / 8;
298652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            child_is_base_class = true;
298752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return base_class_clang_type;
298852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
298952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // We don't increment the child index in the for loop since we might
299052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // be skipping empty base classes
299152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ++child_idx;
299252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
299352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
299452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // Make sure index is in range...
299552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                uint32_t field_idx = 0;
299652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                RecordDecl::field_iterator field, field_end;
299752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
299852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
299952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (idx == child_idx)
300052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
300152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Print the member type if requested
300252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Print the member name and equal sign
300352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name.assign(field->getNameAsString().c_str());
300452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
300552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Figure out the type byte size (field_type_info.first) and
300652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // alignment (field_type_info.second) from the AST context.
300752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ClangASTType field_clang_type (m_ast, field->getType());
300852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
300952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = field_clang_type.GetByteSize();
301052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
301152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Figure out the field offset within the current struct/union/class type
301252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        bit_offset = record_layout.getFieldOffset (field_idx);
301352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_offset = bit_offset / 8;
301452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (ClangASTContext::FieldIsBitfield (m_ast, *field, child_bitfield_bit_size))
301552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            child_bitfield_bit_offset = bit_offset % 8;
301652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
301752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return field_clang_type;
301852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
301952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
302052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
302152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
302252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
302352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
302452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
302552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid && GetCompleteType())
302652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
302752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
302852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                assert (objc_class_type);
302952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (objc_class_type)
303052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
303152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    uint32_t child_idx = 0;
303252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
303352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
303452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (class_interface_decl)
303552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
303652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
303752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ASTRecordLayout &interface_layout = m_ast->getASTObjCInterfaceLayout(class_interface_decl);
303852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
303952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (superclass_interface_decl)
304052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
304152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (omit_empty_base_classes)
304252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
304352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ClangASTType base_class_clang_type (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
304452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
304552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
304652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (idx == 0)
304752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
304852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        QualType ivar_qual_type(m_ast->getObjCInterfaceType(superclass_interface_decl));
304952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
305052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
305152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
305252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
305352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = m_ast->getTypeInfo(ivar_qual_type.getTypePtr());
305452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
305552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_byte_size = ivar_type_info.first / 8;
305652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_byte_offset = 0;
305752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_is_base_class = true;
305852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
305952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        return ClangASTType (m_ast, ivar_qual_type);
306052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
306152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
306252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    ++child_idx;
306352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
306452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
306552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            else
306652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ++child_idx;
306752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
306852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
306952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const uint32_t superclass_idx = child_idx;
307052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
307152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
307252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
307352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
307452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
307552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
307652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
307752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (child_idx == idx)
307852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
307952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    ObjCIvarDecl* ivar_decl = *ivar_pos;
308052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
308152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
308252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
308352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
308452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
308552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = m_ast->getTypeInfo(ivar_qual_type.getTypePtr());
308652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
308752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    child_byte_size = ivar_type_info.first / 8;
308852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
308952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // Figure out the field offset within the current struct/union/class type
309052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
309152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // that doesn't account for the space taken up by unbacked properties, or from
309252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // the changing size of base classes that are newer than this class.
309352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // So if we have a process around that we can ask about this object, do so.
309452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
309552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    Process *process = NULL;
309652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (exe_ctx)
309752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        process = exe_ctx->GetProcessPtr();
309852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (process)
309952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
310052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
310152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        if (objc_runtime != NULL)
310252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        {
310352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            ClangASTType parent_ast_type (m_ast, parent_qual_type);
310452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
310552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        }
310652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
310752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
310852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // Setting this to UINT32_MAX to make sure we don't compute it twice...
310952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    bit_offset = UINT32_MAX;
311052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
311152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
311252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
311352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
311452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_byte_offset = bit_offset / 8;
311552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
311652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
311752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
311852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // of a bitfield within its containing object.  So regardless of where we get the byte
311952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // offset from, we still need to get the bit offset for bitfields from the layout.
312052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
312152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (ClangASTContext::FieldIsBitfield (m_ast, ivar_decl, child_bitfield_bit_size))
312252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
312352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        if (bit_offset == UINT32_MAX)
312452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
312552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
312652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_bitfield_bit_offset = bit_offset % 8;
312752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
312852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType (m_ast, ivar_qual_type);
312952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
313052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ++child_idx;
313152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
313252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
313352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
313452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
313552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
313652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
313752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
313852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:
313952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid)
314052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
314152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType pointee_clang_type (GetPointeeType());
314252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
314352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (transparent_pointers && pointee_clang_type.IsAggregateType())
314452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
314552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    child_is_deref_of_parent = false;
314652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    bool tmp_child_is_deref_of_parent = false;
314752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
314852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        parent_name,
314952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        idx,
315052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        transparent_pointers,
315152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        omit_empty_base_classes,
315252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        ignore_array_bounds,
315352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_name,
315452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_byte_size,
315552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_byte_offset,
315652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_bitfield_bit_size,
315752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_bitfield_bit_offset,
315852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_is_base_class,
315952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        tmp_child_is_deref_of_parent);
316052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
316152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
316252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
316352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    child_is_deref_of_parent = true;
316452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (parent_name)
316552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
316652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name.assign(1, '*');
316752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name += parent_name;
316852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
316952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
317052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    // We have a pointer to an simple type
317152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (idx == 0 && pointee_clang_type.GetCompleteType())
317252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
317352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = pointee_clang_type.GetByteSize();
317452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_offset = 0;
317552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return pointee_clang_type;
317652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
317752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
317852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
317952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
318052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
318152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:
318252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:
318352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid)
318452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
318552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const VectorType *array = cast<VectorType>(parent_qual_type.getTypePtr());
318652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (array)
318752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
318852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType element_type (m_ast, array->getElementType());
318952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (element_type.GetCompleteType())
319052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
319152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        char element_name[64];
319252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ::snprintf (element_name, sizeof (element_name), "[%zu]", idx);
319352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name.assign(element_name);
319452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = element_type.GetByteSize();
319552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
319652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return element_type;
319752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
319852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
319952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
320052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
320152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
320252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:
320352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:
320452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (ignore_array_bounds || idx_is_valid)
320552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
320652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ArrayType *array = cast<ArrayType>(parent_qual_type.getTypePtr());
320752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (array)
320852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
320952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType element_type (m_ast, array->getElementType());
321052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (element_type.GetCompleteType())
321152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
321252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        char element_name[64];
321352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ::snprintf (element_name, sizeof (element_name), "[%zu]", idx);
321452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name.assign(element_name);
321552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = element_type.GetByteSize();
321652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
321752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return element_type;
321852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
321952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
322052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
322152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
322252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
322352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
322452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:
322552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid)
322652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
322752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType pointee_clang_type (GetPointeeType());
322852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
322952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // Don't dereference "void *" pointers
323052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_clang_type.IsVoidType())
323152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType();
323252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
323352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (transparent_pointers && pointee_clang_type.IsAggregateType ())
323452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
323552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    child_is_deref_of_parent = false;
323652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    bool tmp_child_is_deref_of_parent = false;
323752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
323852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        parent_name,
323952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        idx,
324052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        transparent_pointers,
324152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        omit_empty_base_classes,
324252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        ignore_array_bounds,
324352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_name,
324452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_byte_size,
324552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_byte_offset,
324652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_bitfield_bit_size,
324752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_bitfield_bit_offset,
324852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_is_base_class,
324952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        tmp_child_is_deref_of_parent);
325052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
325152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
325252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
325352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    child_is_deref_of_parent = true;
325452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
325552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (parent_name)
325652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
325752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name.assign(1, '*');
325852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name += parent_name;
325952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
326052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
326152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    // We have a pointer to an simple type
326252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (idx == 0)
326352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
326452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = pointee_clang_type.GetByteSize();
326552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_offset = 0;
326652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return pointee_clang_type;
326752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
326852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
326952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
327052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
327152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
327252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:
327352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:
327452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (idx_is_valid)
327552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
327652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
327752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType pointee_clang_type (m_ast, reference_type->getPointeeType());
327852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (transparent_pointers && pointee_clang_type.IsAggregateType ())
327952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
328052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    child_is_deref_of_parent = false;
328152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    bool tmp_child_is_deref_of_parent = false;
328252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
328352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        parent_name,
328452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        idx,
328552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        transparent_pointers,
328652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        omit_empty_base_classes,
328752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        ignore_array_bounds,
328852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_name,
328952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_byte_size,
329052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_byte_offset,
329152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_bitfield_bit_size,
329252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_bitfield_bit_offset,
329352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        child_is_base_class,
329452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        tmp_child_is_deref_of_parent);
329552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
329652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
329752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
329852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (parent_name)
329952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
330052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name.assign(1, '&');
330152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_name += parent_name;
330252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
330352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
330452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    // We have a pointer to an simple type
330552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (idx == 0)
330652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
330752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_size = pointee_clang_type.GetByteSize();
330852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        child_byte_offset = 0;
330952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return pointee_clang_type;
331052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
331152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
331252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
331352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
331452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
331552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
331652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
331752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType typedefed_clang_type (m_ast, cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
331852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx,
331952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      parent_name,
332052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      idx,
332152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      transparent_pointers,
332252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      omit_empty_base_classes,
332352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      ignore_array_bounds,
332452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_name,
332552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_byte_size,
332652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_byte_offset,
332752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_bitfield_bit_size,
332852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_bitfield_bit_offset,
332952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_is_base_class,
333052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      child_is_deref_of_parent);
333152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
333252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
333352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
333452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
333552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
333652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType elaborated_clang_type (m_ast, cast<ElaboratedType>(parent_qual_type)->getNamedType());
333752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx,
333852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       parent_name,
333952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       idx,
334052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       transparent_pointers,
334152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       omit_empty_base_classes,
334252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       ignore_array_bounds,
334352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_name,
334452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_byte_size,
334552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_byte_offset,
334652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_bitfield_bit_size,
334752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_bitfield_bit_offset,
334852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_is_base_class,
334952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       child_is_deref_of_parent);
335052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
335152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
335252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
335352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
335452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType paren_clang_type (m_ast, llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
335552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx,
335652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  parent_name,
335752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  idx,
335852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  transparent_pointers,
335952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  omit_empty_base_classes,
336052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  ignore_array_bounds,
336152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_name,
336252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_byte_size,
336352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_byte_offset,
336452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_bitfield_bit_size,
336552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_bitfield_bit_offset,
336652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_is_base_class,
336752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                  child_is_deref_of_parent);
336852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
336952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
337052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
337152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
337252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
337352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
337452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
337552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
337652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
337752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic inline bool
337852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
337952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
338052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
338152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
338252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
338352f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic uint32_t
338452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetIndexForRecordBase
338552f792329be5db8e38961350589e97e8f2823acdGreg Clayton(
338652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl,
338752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXBaseSpecifier *base_spec,
338852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool omit_empty_base_classes
338952f792329be5db8e38961350589e97e8f2823acdGreg Clayton )
339052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
339152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t child_idx = 0;
339252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
339352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
339452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
339552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    const char *super_name = record_decl->getNameAsCString();
339652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
339752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
339852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //
339952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (cxx_record_decl)
340052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
340152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
340252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
340352f792329be5db8e38961350589e97e8f2823acdGreg Clayton             base_class != base_class_end;
340452f792329be5db8e38961350589e97e8f2823acdGreg Clayton             ++base_class)
340552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
340652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (omit_empty_base_classes)
340752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
340852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (BaseSpecifierIsEmpty (base_class))
340952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    continue;
341052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
341152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
341252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            //            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
341352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            //                    child_idx,
341452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            //                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
341552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            //
341652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            //
341752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (base_class == base_spec)
341852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return child_idx;
341952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ++child_idx;
342052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
342152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
342252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
342352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return UINT32_MAX;
342452f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
342552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
342652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
342752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic uint32_t
342852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetIndexForRecordChild (const RecordDecl *record_decl,
342952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        NamedDecl *canonical_decl,
343052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        bool omit_empty_base_classes)
343152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
343252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t child_idx = ClangASTContext::GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl),
343352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             omit_empty_base_classes);
343452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
343552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl::field_iterator field, field_end;
343652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
343752f792329be5db8e38961350589e97e8f2823acdGreg Clayton         field != field_end;
343852f792329be5db8e38961350589e97e8f2823acdGreg Clayton         ++field, ++child_idx)
343952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
344052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (field->getCanonicalDecl() == canonical_decl)
344152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return child_idx;
344252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
344352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
344452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return UINT32_MAX;
344552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
344652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
344752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Look for a child member (doesn't include base classes, but it does include
344852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// their members) in the type hierarchy. Returns an index path into "clang_type"
344952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// on how to reach the appropriate member.
345052f792329be5db8e38961350589e97e8f2823acdGreg Clayton//
345152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    class A
345252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    {
345352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    public:
345452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//        int m_a;
345552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//        int m_b;
345652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    };
345752f792329be5db8e38961350589e97e8f2823acdGreg Clayton//
345852f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    class B
345952f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    {
346052f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    };
346152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//
346252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    class C :
346352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//        public B,
346452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//        public A
346552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    {
346652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    };
346752f792329be5db8e38961350589e97e8f2823acdGreg Clayton//
346852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// If we have a clang type that describes "class C", and we wanted to looked
346952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// "m_b" in it:
347052f792329be5db8e38961350589e97e8f2823acdGreg Clayton//
347152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// With omit_empty_base_classes == false we would get an integer array back with:
347252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 1,  1 }
347352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The first index 1 is the child index for "class A" within class C
347452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The second index 1 is the child index for "m_b" within class A
347552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//
347652f792329be5db8e38961350589e97e8f2823acdGreg Clayton// With omit_empty_base_classes == true we would get an integer array back with:
347752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 0,  1 }
347852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The first index 0 is the child index for "class A" within class C (since class B doesn't have any members it doesn't count)
347952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The second index 1 is the child index for "m_b" within class A
348052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
348152f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t
348252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetIndexOfChildMemberWithName (const char *name,
348352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                             bool omit_empty_base_classes,
348452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                             std::vector<uint32_t>& child_indexes) const
348552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
348652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid() && name && name[0])
348752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
348852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetCanonicalQualType());
348952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
349052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
349152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
349252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Record:
349352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType ())
349452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
349552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
349652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const RecordDecl *record_decl = record_type->getDecl();
349752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
349852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    assert(record_decl);
349952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    uint32_t child_idx = 0;
350052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
350152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
350252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
350352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    // Try and find a field that matches NAME
350452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    RecordDecl::field_iterator field, field_end;
350552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    StringRef name_sref(name);
350652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
350752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         field != field_end;
350852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         ++field, ++child_idx)
350952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
351052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (field->getName().equals (name_sref))
351152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
351252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            // We have to add on the number of base classes to this index!
351352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
351452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return child_indexes.size();
351552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
351652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
351752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
351852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (cxx_record_decl)
351952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
352052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const RecordDecl *parent_record_decl = cxx_record_decl;
352152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
352252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
352352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
352452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
352552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        // Didn't find things easily, lets let clang do its thang...
352652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        IdentifierInfo & ident_ref = m_ast->Idents.get(name_sref);
352752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        DeclarationName decl_name(&ident_ref);
352852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
352952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        CXXBasePaths paths;
353052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
353152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           decl_name.getAsOpaquePtr(),
353252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           paths))
353352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
353452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            CXXBasePaths::const_paths_iterator path, path_end = paths.end();
353552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            for (path = paths.begin(); path != path_end; ++path)
353652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
353752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const size_t num_path_elements = path->size();
353852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                for (size_t e=0; e<num_path_elements; ++e)
353952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
354052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    CXXBasePathElement elem = (*path)[e];
354152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
354252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
354352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (child_idx == UINT32_MAX)
354452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
354552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_indexes.clear();
354652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        return 0;
354752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
354852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    else
354952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
355052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_indexes.push_back (child_idx);
355152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
355252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
355352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
355452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                for (NamedDecl *path_decl : path->Decls)
355552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
355652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
355752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if (child_idx == UINT32_MAX)
355852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
355952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_indexes.clear();
356052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        return 0;
356152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
356252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    else
356352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    {
356452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        child_indexes.push_back (child_idx);
356552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    }
356652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
356752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
356852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return child_indexes.size();
356952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
357052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
357152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
357252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
357352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
357452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
357552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObject:
357652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCInterface:
357752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType ())
357852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
357952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    StringRef name_sref(name);
358052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
358152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    assert (objc_class_type);
358252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (objc_class_type)
358352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
358452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        uint32_t child_idx = 0;
358552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
358652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
358752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (class_interface_decl)
358852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
358952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
359052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
359152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
359252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
359352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
359452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const ObjCIvarDecl* ivar_decl = *ivar_pos;
359552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
359652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (ivar_decl->getName().equals (name_sref))
359752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
359852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if ((!omit_empty_base_classes && superclass_interface_decl) ||
359952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
360052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        ++child_idx;
360152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
360252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    child_indexes.push_back (child_idx);
360352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return child_indexes.size();
360452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
360552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
360652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
360752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (superclass_interface_decl)
360852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
360952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                // The super class index is always zero for ObjC classes,
361052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                // so we push it onto the child indexes in case we find
361152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                // an ivar in our superclass...
361252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                child_indexes.push_back (0);
361352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
361452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ClangASTType superclass_clang_type (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
361552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
361652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                         omit_empty_base_classes,
361752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                         child_indexes))
361852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
361952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // We did find an ivar in a superclass so just
362052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    // return the results!
362152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return child_indexes.size();
362252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
362352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
362452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                // We didn't find an ivar matching "name" in our
362552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                // superclass, pop the superclass zero index that
362652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                // we pushed on above.
362752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                child_indexes.pop_back();
362852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
362952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
363052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
363152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
363252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
363352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
363452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObjectPointer:
363552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
363652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType objc_object_clang_type (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
363752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
363852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                 omit_empty_base_classes,
363952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                 child_indexes);
364052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
364152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
364252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
364352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
364452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ConstantArray:
364552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
364652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
364752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                const uint64_t element_count = array->getSize().getLimitedValue();
364852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
364952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                if (idx < element_count)
365052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                {
365152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
365252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
365352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    char element_name[32];
365452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
365552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
365652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    child_name.assign(element_name);
365752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    assert(field_type_info.first % 8 == 0);
365852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    child_byte_size = field_type_info.first / 8;
365952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    child_byte_offset = idx * child_byte_size;
366052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    return array->getElementType().getAsOpaquePtr();
366152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                }
366252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
366352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
366452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
366552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //        case clang::Type::MemberPointerType:
366652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //            {
366752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
366852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                QualType pointee_type = mem_ptr_type->getPointeeType();
366952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
367052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
367152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                {
367252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    return GetIndexOfChildWithName (ast,
367352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
367452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                                                    name);
367552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                }
367652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //            }
367752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //            break;
367852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
367952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::LValueReference:
368052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::RValueReference:
368152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
368252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
368352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    QualType pointee_type(reference_type->getPointeeType());
368452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType pointee_clang_type (m_ast, pointee_type);
368552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
368652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (pointee_clang_type.IsAggregateType ())
368752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
368852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return pointee_clang_type.GetIndexOfChildMemberWithName (name,
368952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                 omit_empty_base_classes,
369052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                 child_indexes);
369152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
369252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
369352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
369452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
369552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Pointer:
369652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
369752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType pointee_clang_type (GetPointeeType());
369852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
369952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (pointee_clang_type.IsAggregateType ())
370052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
370152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return pointee_clang_type.GetIndexOfChildMemberWithName (name,
370252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                             omit_empty_base_classes,
370352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                             child_indexes);
370452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
370552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
370652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
370752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
370852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
370952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
371052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                                         omit_empty_base_classes,
371152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                                         child_indexes);
371252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
371352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
371452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
371552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                            omit_empty_base_classes,
371652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                            child_indexes);
371752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
371852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
371952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
372052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                         omit_empty_base_classes,
372152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                                         child_indexes);
372252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
372352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
372452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
372552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
372652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
372752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
372852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
372952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
373052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
373152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Get the index of the child of "clang_type" whose name matches. This function
373252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// doesn't descend into the children, but only looks one level deep and name
373352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// matches can include base class names.
373452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
373552f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
373652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetIndexOfChildWithName (const char *name, bool omit_empty_base_classes) const
373752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
373852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid() && name && name[0])
373952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
374052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetCanonicalQualType());
374152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
374252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
374352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
374452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
374552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
374652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Record:
374752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType ())
374852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
374952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
375052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const RecordDecl *record_decl = record_type->getDecl();
375152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
375252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    assert(record_decl);
375352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    uint32_t child_idx = 0;
375452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
375552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
375652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
375752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (cxx_record_decl)
375852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
375952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
376052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
376152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             base_class != base_class_end;
376252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             ++base_class)
376352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
376452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            // Skip empty base classes
376552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
376652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
376752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                continue;
376852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
376952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ClangASTType base_class_clang_type (m_ast, base_class->getType());
377052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            std::string base_class_type_name (base_class_clang_type.GetTypeName());
377152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (base_class_type_name.compare (name) == 0)
377252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                return child_idx;
377352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ++child_idx;
377452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
377552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
377652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
377752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    // Try and find a field that matches NAME
377852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    RecordDecl::field_iterator field, field_end;
377952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    StringRef name_sref(name);
378052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
378152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         field != field_end;
378252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         ++field, ++child_idx)
378352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
378452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (field->getName().equals (name_sref))
378552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return child_idx;
378652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
378752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
378852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
378952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
379052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
379152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObject:
379252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCInterface:
379352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType())
379452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
379552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    StringRef name_sref(name);
379652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
379752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    assert (objc_class_type);
379852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (objc_class_type)
379952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
380052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        uint32_t child_idx = 0;
380152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
380252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
380352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (class_interface_decl)
380452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
380552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
380652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
380752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
380852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
380952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
381052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                const ObjCIvarDecl* ivar_decl = *ivar_pos;
381152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
381252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (ivar_decl->getName().equals (name_sref))
381352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                {
381452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    if ((!omit_empty_base_classes && superclass_interface_decl) ||
381552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
381652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        ++child_idx;
381752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
381852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return child_idx;
381952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                }
382052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
382152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
382252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (superclass_interface_decl)
382352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
382452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (superclass_interface_decl->getName().equals (name_sref))
382552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return 0;
382652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
382752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
382852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
382952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
383052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
383152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
383252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ObjCObjectPointer:
383352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
383452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType pointee_clang_type (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
383552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
383652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
383752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
383852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
383952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::ConstantArray:
384052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
384152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
384252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                const uint64_t element_count = array->getSize().getLimitedValue();
384352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
384452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                if (idx < element_count)
384552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                {
384652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
384752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
384852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    char element_name[32];
384952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
385052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
385152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    child_name.assign(element_name);
385252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    assert(field_type_info.first % 8 == 0);
385352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    child_byte_size = field_type_info.first / 8;
385452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    child_byte_offset = idx * child_byte_size;
385552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    return array->getElementType().getAsOpaquePtr();
385652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                }
385752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
385852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
385952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
386052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //        case clang::Type::MemberPointerType:
386152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //            {
386252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
386352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                QualType pointee_type = mem_ptr_type->getPointeeType();
386452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
386552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
386652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                {
386752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                    return GetIndexOfChildWithName (ast,
386852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
386952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                                                    name);
387052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //                }
387152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //            }
387252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //            break;
387352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                //
387452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::LValueReference:
387552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::RValueReference:
387652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
387752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
387852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType pointee_type (m_ast, reference_type->getPointeeType());
387952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
388052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (pointee_type.IsAggregateType ())
388152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
388252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
388352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
388452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
388552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
388652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
388752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Pointer:
388852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
388952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
389052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType pointee_type (m_ast, pointer_type->getPointeeType());
389152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
389252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (pointee_type.IsAggregateType ())
389352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
389452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
389552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
389652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    else
389752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
389852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    if (parent_name)
389952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    {
390052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        child_name.assign(1, '*');
390152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        child_name += parent_name;
390252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    }
390352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //
390452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    // We have a pointer to an simple type
390552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    if (idx == 0)
390652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    {
390752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
390852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        assert(clang_type_info.first % 8 == 0);
390952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        child_byte_size = clang_type_info.first / 8;
391052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        child_byte_offset = 0;
391152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                        return pointee_type.getAsOpaquePtr();
391252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        //                    }
391352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
391452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
391552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
391652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
391752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
391852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
391952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
392052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
392152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
392252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
392352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
392452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
392552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
392652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
392752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
392852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
392952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
393052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return UINT32_MAX;
393152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
393252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
393352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
393452f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t
393552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumTemplateArguments () const
393652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
393752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
393852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
393952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
394052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
394152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
394252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
394352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
394452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Record:
394552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType ())
394652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
394752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
394852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (cxx_record_decl)
394952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
395052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
395152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (template_decl)
395252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return template_decl->getTemplateArgs().size();
395352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
395452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
395552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
395652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
395752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
395852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumTemplateArguments();
395952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
396052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
396152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumTemplateArguments();
396252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
396352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
396452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetNumTemplateArguments();
396552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
396652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
396752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
396852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
396952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
397052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
397152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
397252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
397352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
397452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTemplateArgument (size_t arg_idx, lldb::TemplateArgumentKind &kind) const
397552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
397652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
397752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
397852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
397952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
398052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
398152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (type_class)
398252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
398352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Record:
398452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (GetCompleteType ())
398552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
398652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
398752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (cxx_record_decl)
398852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
398952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
399052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
399152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
399252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
399352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            switch (template_arg.getKind())
399452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            {
399552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Null:
399652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindNull;
399752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType();
399852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
399952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Type:
400052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindType;
400152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType(m_ast, template_arg.getAsType());
400252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
400352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Declaration:
400452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindDeclaration;
400552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType();
400652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
400752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Integral:
400852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindIntegral;
400952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType(m_ast, template_arg.getIntegralType());
401052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
401152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Template:
401252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindTemplate;
401352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType();
401452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
401552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::TemplateExpansion:
401652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindTemplateExpansion;
401752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType();
401852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
401952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Expression:
402052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindExpression;
402152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType();
402252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
402352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                case clang::TemplateArgument::Pack:
402452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    kind = eTemplateArgumentKindPack;
402552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    return ClangASTType();
402652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
402752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                default:
402852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    assert (!"Unhandled TemplateArgument::ArgKind");
402952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    break;
403052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            }
403152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
403252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
403352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
403452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
403552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
403652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Typedef:
403752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTemplateArgument (arg_idx, kind);
403852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
403952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Elaborated:
404052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTemplateArgument (arg_idx, kind);
404152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
404252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case clang::Type::Paren:
404352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetTemplateArgument (arg_idx, kind);
404452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
404552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            default:
404652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
404752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
404852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
404952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    kind = eTemplateArgumentKindNull;
405052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType ();
405152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
405252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
405352f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic bool
405452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
405552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
405652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (name == NULL || name[0] == '\0')
405752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
405852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
405952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#define OPERATOR_PREFIX "operator"
406052f792329be5db8e38961350589e97e8f2823acdGreg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
406152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
406252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const char *post_op_name = NULL;
406352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
406452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool no_space = true;
406552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
406652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
406752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
406852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
406952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
407052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
407152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (post_op_name[0] == ' ')
407252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
407352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        post_op_name++;
407452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        no_space = false;
407552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
407652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
407752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#undef OPERATOR_PREFIX
407852f792329be5db8e38961350589e97e8f2823acdGreg Clayton#undef OPERATOR_PREFIX_LENGTH
407952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
408052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // This is an operator, set the overloaded operator kind to invalid
408152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // in case this is a conversion operator...
408252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
408352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
408452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (post_op_name[0])
408552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
408652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
408752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (no_space)
408852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return false;
408952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
409052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case 'n':
409152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (no_space)
409252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return false;
409352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if  (strcmp (post_op_name, "new") == 0)
409452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_New;
409552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (strcmp (post_op_name, "new[]") == 0)
409652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Array_New;
409752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
409852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
409952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case 'd':
410052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (no_space)
410152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return false;
410252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (strcmp (post_op_name, "delete") == 0)
410352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Delete;
410452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (strcmp (post_op_name, "delete[]") == 0)
410552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Array_Delete;
410652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
410752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
410852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '+':
410952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
411052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Plus;
411152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[2] == '\0')
411252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
411352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (post_op_name[1] == '=')
411452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    op_kind = OO_PlusEqual;
411552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (post_op_name[1] == '+')
411652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    op_kind = OO_PlusPlus;
411752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
411852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
411952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
412052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '-':
412152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
412252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Minus;
412352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[2] == '\0')
412452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
412552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (post_op_name[1])
412652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
412752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '=': op_kind = OO_MinusEqual; break;
412852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '-': op_kind = OO_MinusMinus; break;
412952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '>': op_kind = OO_Arrow; break;
413052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
413152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
413252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[3] == '\0')
413352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
413452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (post_op_name[2] == '*')
413552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    op_kind = OO_ArrowStar; break;
413652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
413752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
413852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
413952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '*':
414052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
414152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Star;
414252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
414352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_StarEqual;
414452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
414552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
414652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '/':
414752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
414852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Slash;
414952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
415052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_SlashEqual;
415152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
415252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
415352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '%':
415452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
415552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Percent;
415652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
415752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_PercentEqual;
415852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
415952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
416052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
416152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '^':
416252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
416352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Caret;
416452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
416552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_CaretEqual;
416652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
416752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
416852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '&':
416952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
417052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Amp;
417152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[2] == '\0')
417252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
417352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (post_op_name[1])
417452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
417552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '=': op_kind = OO_AmpEqual; break;
417652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '&': op_kind = OO_AmpAmp; break;
417752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
417852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
417952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
418052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
418152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '|':
418252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
418352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Pipe;
418452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[2] == '\0')
418552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
418652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (post_op_name[1])
418752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
418852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '=': op_kind = OO_PipeEqual; break;
418952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '|': op_kind = OO_PipePipe; break;
419052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
419152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
419252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
419352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
419452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '~':
419552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
419652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Tilde;
419752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
419852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
419952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '!':
420052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
420152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Exclaim;
420252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
420352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_ExclaimEqual;
420452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
420552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
420652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '=':
420752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
420852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Equal;
420952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
421052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_EqualEqual;
421152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
421252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
421352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '<':
421452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
421552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Less;
421652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[2] == '\0')
421752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
421852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (post_op_name[1])
421952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
422052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '<': op_kind = OO_LessLess; break;
422152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '=': op_kind = OO_LessEqual; break;
422252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
422352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
422452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[3] == '\0')
422552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
422652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (post_op_name[2] == '=')
422752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    op_kind = OO_LessLessEqual;
422852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
422952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
423052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
423152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '>':
423252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
423352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Greater;
423452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[2] == '\0')
423552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
423652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                switch (post_op_name[1])
423752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
423852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '>': op_kind = OO_GreaterGreater; break;
423952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    case '=': op_kind = OO_GreaterEqual; break;
424052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
424152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
424252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (post_op_name[1] == '>' &&
424352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     post_op_name[2] == '=' &&
424452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                     post_op_name[3] == '\0')
424552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
424652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_GreaterGreaterEqual;
424752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
424852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
424952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
425052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case ',':
425152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == '\0')
425252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Comma;
425352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
425452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
425552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '(':
425652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == ')' && post_op_name[2] == '\0')
425752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Call;
425852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
425952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
426052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case '[':
426152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (post_op_name[1] == ']' && post_op_name[2] == '\0')
426252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                op_kind = OO_Subscript;
426352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
426452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
426552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
426652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return true;
426752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
426852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
426952f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic inline bool
427052f792329be5db8e38961350589e97e8f2823acdGreg Claytoncheck_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
427152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
427252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Special-case call since it can take any number of operands
427352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if(op_kind == OO_Call)
427452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return true;
427552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
427652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // The parameter count doens't include "this"
427752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (num_params == 0)
427852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return unary;
427952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (num_params == 1)
428052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return binary;
428152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
428252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
428352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
428452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
428552f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::RecordDecl *
428652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetAsRecordDecl () const
428752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
428852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const RecordType *record_type = dyn_cast<RecordType>(GetCanonicalQualType());
428952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (record_type)
429052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return record_type->getDecl();
429152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return NULL;
429252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
429352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
429452f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::CXXRecordDecl *
429552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetAsCXXRecordDecl () const
429652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
429752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetCanonicalQualType()->getAsCXXRecordDecl();
429852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
429952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
430052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonObjCInterfaceDecl *
430152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetAsObjCInterfaceDecl () const
430252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
430352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(GetCanonicalQualType());
430452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (objc_class_type)
430552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return objc_class_type->getInterface();
430652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return NULL;
430752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
430852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
430952f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::FieldDecl *
431052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddFieldToRecordType (const char *name,
431152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    const ClangASTType &field_clang_type,
431252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    AccessType access,
431352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    uint32_t bitfield_bit_size)
431452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
431552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid() || !field_clang_type.IsValid())
431652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
431752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
431852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    FieldDecl *field = NULL;
431952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
432052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::Expr *bit_width = NULL;
432152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (bitfield_bit_size != 0)
432252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
432352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        APInt bitfield_bit_size_apint(m_ast->getTypeSize(m_ast->IntTy), bitfield_bit_size);
432452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bit_width = new (*m_ast)IntegerLiteral (*m_ast, bitfield_bit_size_apint, m_ast->IntTy, SourceLocation());
432552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
432652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
432752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl *record_decl = GetAsRecordDecl ();
432852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (record_decl)
432952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
433052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        field = FieldDecl::Create (*m_ast,
433152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   record_decl,
433252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   SourceLocation(),
433352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   SourceLocation(),
433452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   name ? &m_ast->Idents.get(name) : NULL,  // Identifier
433552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   field_clang_type.GetQualType(),          // Field type
433652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   NULL,            // TInfo *
433752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   bit_width,       // BitWidth
433852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   false,           // Mutable
433952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                   ICIS_NoInit);    // HasInit
434052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
434152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!name)
434252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
434352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // Determine whether this field corresponds to an anonymous
434452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // struct or union.
434552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (const TagType *TagT = field->getType()->getAs<TagType>()) {
434652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (RecordDecl *Rec = dyn_cast<RecordDecl>(TagT->getDecl()))
434752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (!Rec->getDeclName()) {
434852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        Rec->setAnonymousStructOrUnion(true);
434952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        field->setImplicit();
435052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
435152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
435252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
435352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
435452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
435552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (field)
435652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
435752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
435852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
435952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            record_decl->addDecl(field);
436052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
436152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
436252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            VerifyDecl(field);
436352f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
436452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
436552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
436652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
436752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
436852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
436952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
437052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (class_interface_decl)
437152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
437252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const bool is_synthesized = false;
437352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
437452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            field_clang_type.GetCompleteType();
437552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
437652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            field = ObjCIvarDecl::Create (*m_ast,
437752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          class_interface_decl,
437852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
437952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
438052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          name ? &m_ast->Idents.get(name) : NULL,   // Identifier
438152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          field_clang_type.GetQualType(),           // Field type
438252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          NULL,                                     // TypeSourceInfo *
438352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          ConvertAccessTypeToObjCIvarAccessControl (access),
438452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          bit_width,
438552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          is_synthesized);
438652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
438752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (field)
438852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
438952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                class_interface_decl->addDecl(field);
439052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
439152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
439252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                VerifyDecl(field);
439352f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
439452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
439552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
439652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
439752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return field;
439852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
439952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
440052f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid
440152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::BuildIndirectFields ()
440252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
440352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl *record_decl = GetAsRecordDecl();
440452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
440552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!record_decl)
440652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return;
440752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
440852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector;
440952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
441052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    IndirectFieldVector indirect_fields;
441152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl::field_iterator field_pos;
441252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl::field_iterator field_end_pos = record_decl->field_end();
441352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl::field_iterator last_field_pos = field_end_pos;
441452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
441552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
441652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (field_pos->isAnonymousStructOrUnion())
441752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
441852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType field_qual_type = field_pos->getType();
441952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
442052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const RecordType *field_record_type = field_qual_type->getAs<RecordType>();
442152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
442252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (!field_record_type)
442352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                continue;
442452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
442552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            RecordDecl *field_record_decl = field_record_type->getDecl();
442652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
442752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (!field_record_decl)
442852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                continue;
442952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
443052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
443152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 di != de;
443252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 ++di)
443352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
443452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di))
443552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
443652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    NamedDecl **chain = new (*m_ast) NamedDecl*[2];
443752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    chain[0] = *field_pos;
443852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    chain[1] = nested_field_decl;
443952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*m_ast,
444052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  record_decl,
444152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  SourceLocation(),
444252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  nested_field_decl->getIdentifier(),
444352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  nested_field_decl->getType(),
444452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  chain,
444552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  2);
444652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
444752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
444852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                     nested_field_decl->getAccess()));
444952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
445052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    indirect_fields.push_back(indirect_field);
445152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
445252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di))
445352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
445452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    int nested_chain_size = nested_indirect_field_decl->getChainingSize();
445552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    NamedDecl **chain = new (*m_ast) NamedDecl*[nested_chain_size + 1];
445652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    chain[0] = *field_pos;
445752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
445852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    int chain_index = 1;
445952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
446052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         nce = nested_indirect_field_decl->chain_end();
446152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         nci < nce;
446252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         ++nci)
446352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
446452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        chain[chain_index] = *nci;
446552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        chain_index++;
446652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
446752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
446852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*m_ast,
446952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  record_decl,
447052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  SourceLocation(),
447152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  nested_indirect_field_decl->getIdentifier(),
447252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  nested_indirect_field_decl->getType(),
447352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  chain,
447452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                  nested_chain_size + 1);
447552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
447652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
447752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                     nested_indirect_field_decl->getAccess()));
447852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
447952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    indirect_fields.push_back(indirect_field);
448052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
448152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
448252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
448352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
448452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
448552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Check the last field to see if it has an incomplete array type as its
448652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // last member and if it does, the tell the record decl about it
448752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (last_field_pos != field_end_pos)
448852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
448952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (last_field_pos->getType()->isIncompleteArrayType())
449052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            record_decl->hasFlexibleArrayMember();
449152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
449252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
449352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
449452f792329be5db8e38961350589e97e8f2823acdGreg Clayton         ifi < ife;
449552f792329be5db8e38961350589e97e8f2823acdGreg Clayton         ++ifi)
449652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
449752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        record_decl->addDecl(*ifi);
449852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
449952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
450052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
450152f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::VarDecl *
450252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddVariableToRecordType (const char *name,
450352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                       const ClangASTType &var_type,
450452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                       AccessType access)
450552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
450652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::VarDecl *var_decl = NULL;
450752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
450852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid() || !var_type.IsValid())
450952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
451052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
451152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    RecordDecl *record_decl = GetAsRecordDecl ();
451252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (record_decl)
451352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
451452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        var_decl = VarDecl::Create (*m_ast,                                     // ASTContext &
451552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    record_decl,                                // DeclContext *
451652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    SourceLocation(),                           // SourceLocation StartLoc
451752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    SourceLocation(),                           // SourceLocation IdLoc
451852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    name ? &m_ast->Idents.get(name) : NULL,     // IdentifierInfo *
451952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    var_type.GetQualType(),                     // Variable QualType
452052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    NULL,                                       // TypeSourceInfo *
452152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    SC_Static);                                 // StorageClass
452252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (var_decl)
452352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
452452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
452552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            record_decl->addDecl(var_decl);
452652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
452752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
452852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            VerifyDecl(var_decl);
452952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
453052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
453152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
453252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return var_decl;
453352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
453452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
453552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
453652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonCXXMethodDecl *
453752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddMethodToCXXRecordType (const char *name,
453852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        const ClangASTType &method_clang_type,
453952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        lldb::AccessType access,
454052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool is_virtual,
454152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool is_static,
454252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool is_inline,
454352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool is_explicit,
454452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool is_attr_used,
454552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        bool is_artificial)
454652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
454752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid() || !method_clang_type.IsValid() || name == NULL || name[0] == '\0')
454852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
454952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
455052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType record_qual_type(GetCanonicalQualType());
455152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
455252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
455352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
455452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (cxx_record_decl == NULL)
455552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
455652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
455752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType method_qual_type (method_clang_type.GetQualType());
455852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
455952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
456052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
456152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    DeclarationName decl_name (&m_ast->Idents.get(name));
456252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
456352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::FunctionType *function_type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
456452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
456552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (function_type == NULL)
456652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
456752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
456852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_type));
456952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
457052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!method_function_prototype)
457152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
457252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
457352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
457452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
457552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CXXDestructorDecl *cxx_dtor_decl(NULL);
457652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    CXXConstructorDecl *cxx_ctor_decl(NULL);
457752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
457852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (is_artificial)
457952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL; // skip everything artificial
458052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
458152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (name[0] == '~')
458252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
458352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        cxx_dtor_decl = CXXDestructorDecl::Create (*m_ast,
458452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   cxx_record_decl,
458552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   SourceLocation(),
458652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   DeclarationNameInfo (m_ast->DeclarationNames.getCXXDestructorName (m_ast->getCanonicalType (record_qual_type)), SourceLocation()),
458752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   method_qual_type,
458852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   NULL,
458952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   is_inline,
459052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   is_artificial);
459152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        cxx_method_decl = cxx_dtor_decl;
459252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
459352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else if (decl_name == cxx_record_decl->getDeclName())
459452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
459552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        cxx_ctor_decl = CXXConstructorDecl::Create (*m_ast,
459652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    cxx_record_decl,
459752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    SourceLocation(),
459852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    DeclarationNameInfo (m_ast->DeclarationNames.getCXXConstructorName (m_ast->getCanonicalType (record_qual_type)), SourceLocation()),
459952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    method_qual_type,
460052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    NULL, // TypeSourceInfo *
460152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_explicit,
460252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_inline,
460352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_artificial,
460452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    false /*is_constexpr*/);
460552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        cxx_method_decl = cxx_ctor_decl;
460652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
460752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
460852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
460952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        clang::StorageClass SC = is_static ? SC_Static : SC_None;
461052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
461152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
461252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (IsOperator (name, op_kind))
461352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
461452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
461552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
461652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // Check the number of operator parameters. Sometimes we have
461752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // seen bad DWARF that doesn't correctly describe operators and
461852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // if we try to create a methed and add it to the class, clang
461952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // will assert and crash, so we need to make sure things are
462052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // acceptable.
462152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
462252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return NULL;
462352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                cxx_method_decl = CXXMethodDecl::Create (*m_ast,
462452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         cxx_record_decl,
462552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         SourceLocation(),
462652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         DeclarationNameInfo (m_ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
462752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         method_qual_type,
462852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         NULL, // TypeSourceInfo *
462952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         SC,
463052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         is_inline,
463152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         false /*is_constexpr*/,
463252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         SourceLocation());
463352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
463452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else if (num_params == 0)
463552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
463652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // Conversion operators don't take params...
463752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                cxx_method_decl = CXXConversionDecl::Create (*m_ast,
463852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             cxx_record_decl,
463952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             SourceLocation(),
464052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             DeclarationNameInfo (m_ast->DeclarationNames.getCXXConversionFunctionName (m_ast->getCanonicalType (function_type->getResultType())), SourceLocation()),
464152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             method_qual_type,
464252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             NULL, // TypeSourceInfo *
464352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             is_inline,
464452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             is_explicit,
464552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             false /*is_constexpr*/,
464652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                             SourceLocation());
464752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
464852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
464952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
465052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (cxx_method_decl == NULL)
465152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
465252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_method_decl = CXXMethodDecl::Create (*m_ast,
465352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     cxx_record_decl,
465452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     SourceLocation(),
465552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
465652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     method_qual_type,
465752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     NULL, // TypeSourceInfo *
465852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     SC,
465952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     is_inline,
466052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     false /*is_constexpr*/,
466152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                     SourceLocation());
466252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
466352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
466452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
466552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
466652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
466752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
466852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
466952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
467052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (is_attr_used)
467152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        cxx_method_decl->addAttr(::new (*m_ast) UsedAttr(SourceRange(), *m_ast));
467252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
467352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Populate the method decl with parameter decls
467452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
467552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    llvm::SmallVector<ParmVarDecl *, 12> params;
467652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
467752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (unsigned param_index = 0;
467852f792329be5db8e38961350589e97e8f2823acdGreg Clayton         param_index < num_params;
467952f792329be5db8e38961350589e97e8f2823acdGreg Clayton         ++param_index)
468052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
468152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        params.push_back (ParmVarDecl::Create (*m_ast,
468252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               cxx_method_decl,
468352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               SourceLocation(),
468452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               SourceLocation(),
468552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               NULL, // anonymous
468652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               method_function_prototype->getArgType(param_index),
468752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               NULL,
468852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               SC_None,
468952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               NULL));
469052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
469152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
469252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
469352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
469452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
469552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
469652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Sometimes the debug info will mention a constructor (default/copy/move),
469752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // destructor, or assignment operator (copy/move) but there won't be any
469852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // version of this in the code. So we check if the function was artificially
469952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // generated and if it is trivial and this lets the compiler/backend know
470052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // that it can inline the IR for these when it needs to and we can avoid a
470152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // "missing function" error when running expressions.
470252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
470352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (is_artificial)
470452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
470552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (cxx_ctor_decl &&
470652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
470752f792329be5db8e38961350589e97e8f2823acdGreg Clayton             (cxx_ctor_decl->isCopyConstructor()    && cxx_record_decl->hasTrivialCopyConstructor    ()) ||
470852f792329be5db8e38961350589e97e8f2823acdGreg Clayton             (cxx_ctor_decl->isMoveConstructor()    && cxx_record_decl->hasTrivialMoveConstructor    ()) ))
470952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
471052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_ctor_decl->setDefaulted();
471152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_ctor_decl->setTrivial(true);
471252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
471352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if (cxx_dtor_decl)
471452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
471552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (cxx_record_decl->hasTrivialDestructor())
471652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
471752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                cxx_dtor_decl->setDefaulted();
471852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                cxx_dtor_decl->setTrivial(true);
471952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
472052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
472152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
472252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
472352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
472452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_method_decl->setDefaulted();
472552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_method_decl->setTrivial(true);
472652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
472752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
472852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
472952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
473052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    VerifyDecl(cxx_method_decl);
473152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
473252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
473352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->isPolymorphic()             = %i\n", cxx_record_decl->isPolymorphic());
473452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->isAggregate()               = %i\n", cxx_record_decl->isAggregate());
473552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->isPOD()                     = %i\n", cxx_record_decl->isPOD());
473652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->isEmpty()                   = %i\n", cxx_record_decl->isEmpty());
473752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->isAbstract()                = %i\n", cxx_record_decl->isAbstract());
473852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->hasTrivialConstructor()     = %i\n", cxx_record_decl->hasTrivialConstructor());
473952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
474052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->hasTrivialCopyAssignment()  = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
474152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //    printf ("decl->hasTrivialDestructor()      = %i\n", cxx_record_decl->hasTrivialDestructor());
474252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return cxx_method_decl;
474352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
474452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
474552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
474652f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark C++ Base Classes
474752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
474852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonCXXBaseSpecifier *
474952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CreateBaseClassSpecifier (AccessType access, bool is_virtual, bool base_of_class)
475052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
475152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
475252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return new CXXBaseSpecifier (SourceRange(),
475352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     is_virtual,
475452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     base_of_class,
475552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
475652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     m_ast->getTrivialTypeSourceInfo (GetQualType()),
475752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     SourceLocation());
475852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return NULL;
475952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
476052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
476152f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid
476252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
476352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
476452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
476552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
476652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        delete base_classes[i];
476752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        base_classes[i] = NULL;
476852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
476952f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
477052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
477152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
477252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetBaseClassesForClassType (CXXBaseSpecifier const * const *base_classes,
477352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          unsigned num_base_classes)
477452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
477552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
477652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
477752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl();
477852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (cxx_record_decl)
477952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
478052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_record_decl->setBases(base_classes, num_base_classes);
478152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
478252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
478352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
478452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
478552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
478652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
478752f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
478852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetObjCSuperClass (const ClangASTType &superclass_clang_type)
478952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
479052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid() && superclass_clang_type.IsValid())
479152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
479252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
479352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ObjCInterfaceDecl *super_interface_decl = superclass_clang_type.GetAsObjCInterfaceDecl ();
479452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (class_interface_decl && super_interface_decl)
479552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
479652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            class_interface_decl->setSuperClass(super_interface_decl);
479752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
479852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
479952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
480052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
480152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
480252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
480352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
480452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddObjCClassProperty (const char *property_name,
480552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    const ClangASTType &property_clang_type,
480652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    ObjCIvarDecl *ivar_decl,
480752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    const char *property_setter_name,
480852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    const char *property_getter_name,
480952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    uint32_t property_attributes,
481052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                    ClangASTMetadata *metadata)
481152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
481252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid() || !property_clang_type.IsValid() || property_name == NULL || property_name[0] == '\0')
481352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
481452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
481552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
481652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
481752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (class_interface_decl)
481852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
481952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType property_clang_type_to_access;
482052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
482152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (property_clang_type.IsValid())
482252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            property_clang_type_to_access = property_clang_type;
482352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if (ivar_decl)
482452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            property_clang_type_to_access = ClangASTType (m_ast, ivar_decl->getType());
482552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
482652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (class_interface_decl && property_clang_type_to_access.IsValid())
482752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
482852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            clang::TypeSourceInfo *prop_type_source;
482952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (ivar_decl)
483052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                prop_type_source = m_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
4831d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton            else
483252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                prop_type_source = m_ast->getTrivialTypeSourceInfo (property_clang_type.GetQualType());
483352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
483452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create (*m_ast,
483552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        class_interface_decl,
483652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        SourceLocation(), // Source Location
483752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        &m_ast->Idents.get(property_name),
483852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        SourceLocation(), //Source Location for AT
483952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        SourceLocation(), //Source location for (
484052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        prop_type_source);
484152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
484252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (property_decl)
4843d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton            {
484452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (metadata)
484552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTContext::SetMetadata(m_ast, property_decl, *metadata);
484652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
484752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                class_interface_decl->addDecl (property_decl);
484852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
484952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                Selector setter_sel, getter_sel;
485052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
485152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_setter_name != NULL)
485252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
485352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
485452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    clang::IdentifierInfo *setter_ident = &m_ast->Idents.get(property_setter_no_colon.c_str());
485552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    setter_sel = m_ast->Selectors.getSelector(1, &setter_ident);
485652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
485752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
485852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
485952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    std::string setter_sel_string("set");
486052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    setter_sel_string.push_back(::toupper(property_name[0]));
486152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    setter_sel_string.append(&property_name[1]);
486252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    clang::IdentifierInfo *setter_ident = &m_ast->Idents.get(setter_sel_string.c_str());
486352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    setter_sel = m_ast->Selectors.getSelector(1, &setter_ident);
486452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
486552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                property_decl->setSetterName(setter_sel);
486652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
486752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
486852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_getter_name != NULL)
486952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
487052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    clang::IdentifierInfo *getter_ident = &m_ast->Idents.get(property_getter_name);
487152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    getter_sel = m_ast->Selectors.getSelector(0, &getter_ident);
487252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
4873d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                else
487452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
487552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    clang::IdentifierInfo *getter_ident = &m_ast->Idents.get(property_name);
487652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    getter_sel = m_ast->Selectors.getSelector(0, &getter_ident);
487752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
487852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                property_decl->setGetterName(getter_sel);
487952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
488052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
488152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (ivar_decl)
488252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyIvarDecl (ivar_decl);
488352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
488452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_attributes & DW_APPLE_PROPERTY_readonly)
488552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
488652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_attributes & DW_APPLE_PROPERTY_readwrite)
488752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
488852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_attributes & DW_APPLE_PROPERTY_assign)
488952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
489052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_attributes & DW_APPLE_PROPERTY_retain)
489152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
489252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_attributes & DW_APPLE_PROPERTY_copy)
489352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
489452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
489552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
489652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
489752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
489852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
489952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isInstance = true;
490052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isVariadic = false;
490152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isSynthesized = false;
490252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isImplicitlyDeclared = true;
490352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isDefined = false;
490452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
490552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool HasRelatedResultType = false;
490652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
490752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCMethodDecl *getter = ObjCMethodDecl::Create (*m_ast,
490852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     SourceLocation(),
490952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     SourceLocation(),
491052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     getter_sel,
491152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     property_clang_type_to_access.GetQualType(),
491252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     NULL,
491352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     class_interface_decl,
491452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isInstance,
491552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isVariadic,
491652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isSynthesized,
491752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isImplicitlyDeclared,
491852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isDefined,
491952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     impControl,
492052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     HasRelatedResultType);
492152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
492252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (getter && metadata)
492352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ClangASTContext::SetMetadata(m_ast, getter, *metadata);
492452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
492552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    getter->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
492652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
492752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    class_interface_decl->addDecl(getter);
492852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
492952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
493052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
493152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
493252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    QualType result_type = m_ast->VoidTy;
493352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
493452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isInstance = true;
493552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isVariadic = false;
493652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isSynthesized = false;
493752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isImplicitlyDeclared = true;
493852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool isDefined = false;
493952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
494052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const bool HasRelatedResultType = false;
494152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
494252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCMethodDecl *setter = ObjCMethodDecl::Create (*m_ast,
494352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     SourceLocation(),
494452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     SourceLocation(),
494552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     setter_sel,
494652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     result_type,
494752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     NULL,
494852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     class_interface_decl,
494952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isInstance,
495052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isVariadic,
495152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isSynthesized,
495252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isImplicitlyDeclared,
495352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     isDefined,
495452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     impControl,
495552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     HasRelatedResultType);
495652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
495752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (setter && metadata)
495852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ClangASTContext::SetMetadata(m_ast, setter, *metadata);
495952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
496052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    llvm::SmallVector<ParmVarDecl *, 1> params;
496152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
496252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    params.push_back (ParmVarDecl::Create (*m_ast,
496352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           setter,
496452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           SourceLocation(),
496552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           SourceLocation(),
496652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           NULL, // anonymous
496752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           property_clang_type_to_access.GetQualType(),
496852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           NULL,
496952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           SC_Auto,
497052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                           NULL));
497152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
497252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    setter->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
497352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
497452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    class_interface_decl->addDecl(setter);
497552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
497652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
497752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
4978d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton            }
497952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
498052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
498152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
498252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
498352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
498452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
498552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCClassTypeAndHasIVars (bool check_superclass) const
498652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
498752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
498852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (class_interface_decl)
498952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ObjCDeclHasIVars (class_interface_decl, check_superclass);
499052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
499152f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
499252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
499352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
499452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonObjCMethodDecl *
499552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddMethodToObjCObjectType (const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
499652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         const ClangASTType &method_clang_type,
499752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         lldb::AccessType access,
499852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                         bool is_artificial)
499952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
500052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid() || !method_clang_type.IsValid())
500152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
500252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
500352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl();
500452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
500552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (class_interface_decl == NULL)
500652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
500752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
500852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
500952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (selector_start == NULL)
501052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
501152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
501252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    selector_start++;
501352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
501452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
501552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    size_t len = 0;
501652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const char *start;
501752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //printf ("name = '%s'\n", name);
501852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
501952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    unsigned num_selectors_with_args = 0;
502052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (start = selector_start;
502152f792329be5db8e38961350589e97e8f2823acdGreg Clayton         start && *start != '\0' && *start != ']';
502252f792329be5db8e38961350589e97e8f2823acdGreg Clayton         start += len)
502352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
502452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        len = ::strcspn(start, ":]");
502552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bool has_arg = (start[len] == ':');
502652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (has_arg)
502752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ++num_selectors_with_args;
502852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        selector_idents.push_back (&m_ast->Idents.get (StringRef (start, len)));
502952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (has_arg)
503052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            len += 1;
503152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
503252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
503352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
503452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (selector_idents.size() == 0)
503552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return 0;
503652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
503752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::Selector method_selector = m_ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
503852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                    selector_idents.data());
503952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
504052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType method_qual_type (method_clang_type.GetQualType());
504152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
504252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Populate the method decl with parameter decls
504352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type *method_type(method_qual_type.getTypePtr());
504452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
504552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (method_type == NULL)
504652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
504752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
504852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
504952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
505052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!method_function_prototype)
505152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
505252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
505352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
505452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool is_variadic = false;
505552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool is_synthesized = false;
505652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool is_defined = false;
505752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
505852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
505952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
506052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
506152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (num_args != num_selectors_with_args)
506252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL; // some debug information is corrupt.  We are not going to deal with it.
506352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
506452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*m_ast,
506552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               SourceLocation(), // beginLoc,
506652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               SourceLocation(), // endLoc,
506752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               method_selector,
506852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               method_function_prototype->getResultType(),
506952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
507052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               GetDeclContextForType (),
507152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               name[0] == '-',
507252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               is_variadic,
507352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               is_synthesized,
507452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               true, // is_implicitly_declared; we force this to true because we don't have source locations
507552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               is_defined,
507652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               imp_control,
507752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                               false /*has_related_result_type*/);
507852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
507952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
508052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (objc_method_decl == NULL)
508152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
508252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
508352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (num_args > 0)
508452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
508552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
508652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
508752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        for (unsigned param_index = 0; param_index < num_args; ++param_index)
508852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
508952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            params.push_back (ParmVarDecl::Create (*m_ast,
509052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   objc_method_decl,
509152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   SourceLocation(),
509252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   SourceLocation(),
509352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   NULL, // anonymous
509452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
509552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   NULL,
509652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   SC_Auto,
509752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   NULL));
509852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
509952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
510052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        objc_method_decl->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
510152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
510252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
510352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
510452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
510552f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
510652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    VerifyDecl(objc_method_decl);
510752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
510852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
510952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return objc_method_decl;
511052f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
511119b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton
511252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
511352f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::DeclContext *
511452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetDeclContextForType () const
511552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
511652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
511752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return NULL;
511852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
511952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetCanonicalQualType());
512052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
512152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
512252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
512352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnaryTransform:           break;
512452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionNoProto:          break;
512552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::FunctionProto:            break;
512652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::IncompleteArray:          break;
512752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::VariableArray:            break;
512852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ConstantArray:            break;
512952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedArray:      break;
513052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ExtVector:                break;
513152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentSizedExtVector:  break;
513252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Vector:                   break;
513352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Builtin:                  break;
513452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::BlockPointer:             break;
513552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Pointer:                  break;
513652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::LValueReference:          break;
513752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::RValueReference:          break;
513852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::MemberPointer:            break;
513952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Complex:                  break;
514052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:               break;
514152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
514252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObjectPointer:        return ClangASTType (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType()).GetDeclContextForType();
514352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
514452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
514552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:                  return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetDeclContextForType();
514652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:               return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetDeclContextForType();
514752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:                    return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetDeclContextForType();
514852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOfExpr:               break;
514952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TypeOf:                   break;
515052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Decltype:                 break;
515152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            //case clang::Type::QualifiedName:          break;
515252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::TemplateSpecialization:   break;
515352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::DependentTemplateSpecialization:  break;
5154d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::TemplateTypeParm:         break;
5155d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::SubstTemplateTypeParm:    break;
5156d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::SubstTemplateTypeParmPack:break;
515752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::PackExpansion:            break;
515852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::UnresolvedUsing:          break;
515952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Attributed:               break;
5160d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::Auto:                     break;
5161d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::InjectedClassName:        break;
5162d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        case clang::Type::DependentName:            break;
5163bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        case clang::Type::Atomic:                   break;
5164d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
516552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // No DeclContext in this type...
516652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return NULL;
5167d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton}
5168d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
516952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
517052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetDefaultAccessForRecordFields (int default_accessibility,
517152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               int *assigned_accessibilities,
517252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               size_t num_assigned_accessibilities)
517362fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton{
517452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
517562fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton    {
517652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        RecordDecl *record_decl = GetAsRecordDecl();
517752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (record_decl)
517862fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton        {
517952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint32_t field_idx;
518052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            RecordDecl::field_iterator field, field_end;
518152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
518252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 field != field_end;
518352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 ++field, ++field_idx)
518462fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton            {
518552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // If no accessibility was assigned, assign the correct one
518652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
518752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    field->setAccess ((AccessSpecifier)default_accessibility);
518852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
518952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
519052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
519152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
519252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
519352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
519462fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton
519562fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton
519652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
519752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetHasExternalStorage (bool has_extern)
519852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
519952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
520052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
520152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
520252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type (GetCanonicalQualType());
520352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
520452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
520552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (type_class)
520652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
520752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Record:
520852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
520952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
521052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (cxx_record_decl)
521152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
521252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                cxx_record_decl->setHasExternalLexicalStorage (has_extern);
521352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                cxx_record_decl->setHasExternalVisibleStorage (has_extern);
521452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
521562fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton            }
521652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
521762fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton            break;
521852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
521952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Enum:
522052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
522152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
522252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (enum_decl)
522352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
522452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                enum_decl->setHasExternalLexicalStorage (has_extern);
522552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                enum_decl->setHasExternalVisibleStorage (has_extern);
522652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
522752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
522852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
522952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
523052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
523152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCObject:
523252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::ObjCInterface:
523352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
523452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
523552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            assert (objc_class_type);
523652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (objc_class_type)
523752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
523852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
523952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
524052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (class_interface_decl)
524152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
524252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    class_interface_decl->setHasExternalLexicalStorage (has_extern);
524352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    class_interface_decl->setHasExternalVisibleStorage (has_extern);
524452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
524552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
524652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
524762fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton        }
524852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
524952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
525052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Typedef:
525152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).SetHasExternalStorage (has_extern);
525252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
525352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Elaborated:
525452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).SetHasExternalStorage (has_extern);
525552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
525652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::Type::Paren:
525752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).SetHasExternalStorage (has_extern);
525852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
525952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        default:
526052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
526162fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton    }
526252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
526362fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton}
526462fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton
526552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
526652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetTagTypeKind (int kind) const
52671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
526852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
52691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
527052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType tag_qual_type(GetQualType());
527152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type *clang_type = tag_qual_type.getTypePtr();
527252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (clang_type)
527352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
527452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const TagType *tag_type = dyn_cast<TagType>(clang_type);
527552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (tag_type)
527652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
527752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
527852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (tag_decl)
527952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
528052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
528152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
528252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
528352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
528452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
528552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
528652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
528752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
52881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
52891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
529052f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark TagDecl
52911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
529252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
529352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::StartTagDeclarationDefinition ()
529452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
529552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
529652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
529752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetQualType());
529852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type *t = qual_type.getTypePtr();
529952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (t)
530052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
530152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const TagType *tag_type = dyn_cast<TagType>(t);
530252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (tag_type)
530352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
530452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                TagDecl *tag_decl = tag_type->getDecl();
530552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (tag_decl)
530652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
530752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    tag_decl->startDefinition();
530852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
530952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
531052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
531152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
531252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t);
531352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (object_type)
531452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
531552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ObjCInterfaceDecl *interface_decl = object_type->getInterface();
531652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (interface_decl)
531752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
531852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    interface_decl->startDefinition();
531952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
532052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
532152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
532252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
532352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
532452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
532552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
53261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
532752f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
532852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CompleteTagDeclarationDefinition ()
532952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
533052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
533152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
533252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetQualType());
5333b9f09a6188dc2b48bf7f5677bc1eef9a73c3fa25Sean Callanan
533452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
533552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
533652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (cxx_record_decl)
533752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
533852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            cxx_record_decl->completeDefinition();
533952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
534052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return true;
53411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
534252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
534352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
534452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
534552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (enum_type)
5346e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        {
534752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
534852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
534952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (enum_decl)
5350e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
535152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                /// TODO This really needs to be fixed.
535252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
535352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                unsigned NumPositiveBits = 1;
535452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                unsigned NumNegativeBits = 0;
535552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
535652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                QualType promotion_qual_type;
535752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // If the enum integer type is less than an integer in bit width,
535852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // then we must promote it to an integer size.
535952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (m_ast->getTypeSize(enum_decl->getIntegerType()) < m_ast->getTypeSize(m_ast->IntTy))
536052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
536152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
536252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        promotion_qual_type = m_ast->IntTy;
536352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    else
536452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        promotion_qual_type = m_ast->UnsignedIntTy;
536552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
536652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else
536752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
536852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
536952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
537052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return true;
5371e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
5372e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        }
537352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
537452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
537552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
53761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
537719b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton
53781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
5379bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton
53801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
53811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
53821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
538352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
538452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddEnumerationValueToEnumerationType (const ClangASTType &enumerator_clang_type,
538552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    const Declaration &decl,
538652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    const char *name,
538752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    int64_t enum_value,
538852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    uint32_t enum_value_bit_size)
538952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
539052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid() && enumerator_clang_type.IsValid() && name && name[0])
53911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
539252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType enum_qual_type (GetCanonicalQualType());
53939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
539452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bool is_signed = false;
539552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        enumerator_clang_type.IsIntegerType (is_signed);
539652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const clang::Type *clang_type = enum_qual_type.getTypePtr();
539752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (clang_type)
539852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
539952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
540052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
540152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (enum_type)
540252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
540352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
540452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                enum_llvm_apsint = enum_value;
540552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                EnumConstantDecl *enumerator_decl =
540652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                EnumConstantDecl::Create (*m_ast,
540752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          enum_type->getDecl(),
540852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
540952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          name ? &m_ast->Idents.get(name) : NULL,    // Identifier
541052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          enumerator_clang_type.GetQualType(),
541152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          NULL,
541252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          enum_llvm_apsint);
541352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
541452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (enumerator_decl)
541552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
541652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    enum_type->getDecl()->addDecl(enumerator_decl);
541752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
541852f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
541952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    VerifyDecl(enumerator_decl);
542052f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
542152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
542252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return true;
542352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
542452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
542552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
542652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
542752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return false;
542852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
54291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
54301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
543152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
543252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetEnumerationIntegerType () const
543352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
543452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType enum_qual_type (GetCanonicalQualType());
543552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const clang::Type *clang_type = enum_qual_type.getTypePtr();
543652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (clang_type)
543752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
543852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
543952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (enum_type)
544052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
544152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
544252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (enum_decl)
544352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (m_ast, enum_decl->getIntegerType());
544452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
544552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
544652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
544752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
544852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
544952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
545052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CreateMemberPointerType (const ClangASTType &pointee_type) const
545152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
545252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid() && pointee_type.IsValid())
545352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
545452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (m_ast, m_ast->getMemberPointerType (pointee_type.GetQualType(),
545552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                 GetQualType().getTypePtr()));
545652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
545752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
545852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
54591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
54601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
546152f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t
546252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::ConvertStringToFloatValue (const char *s, uint8_t *dst, size_t dst_size) const
546352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
546452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
546552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
546652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type (GetCanonicalQualType());
546752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        uint32_t count = 0;
546852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bool is_complex = false;
546952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (IsFloatingPointType (count, is_complex))
5470e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        {
547152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // TODO: handle complex and vector types
547252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (count != 1)
547352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return false;
547452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
547552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            StringRef s_sref(s);
547652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            APFloat ap_float(m_ast->getFloatTypeSemantics(qual_type), s_sref);
547752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
547852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const uint64_t bit_size = m_ast->getTypeSize (qual_type);
547952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const uint64_t byte_size = bit_size / 8;
548052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (dst_size >= byte_size)
548152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
548252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (bit_size == sizeof(float)*8)
548352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
548452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    float float32 = ap_float.convertToFloat();
548552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ::memcpy (dst, &float32, byte_size);
548652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return byte_size;
548752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
548852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (bit_size >= 64)
548952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
549052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
549152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ::memcpy (dst, ap_int.getRawData(), byte_size);
549252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return byte_size;
549352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
549452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
5495e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        }
54961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
549752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return 0;
54981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
54991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
55001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
550152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
550252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
550352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Dumping types
550452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//----------------------------------------------------------------------
55051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#define DEPTH_INCREMENT 2
550652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
55071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonvoid
550852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpValue (ExecutionContext *exe_ctx,
550952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         Stream *s,
551052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         lldb::Format format,
551152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         const lldb_private::DataExtractor &data,
551252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         lldb::offset_t data_byte_offset,
551352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         size_t data_byte_size,
551452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         uint32_t bitfield_bit_size,
551552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         uint32_t bitfield_bit_offset,
551652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         bool show_types,
551752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         bool show_summary,
551852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         bool verbose,
551952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                         uint32_t depth)
552052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
552152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
552252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return;
552352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
552452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType qual_type(GetQualType());
55251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    switch (qual_type->getTypeClass())
55261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
55271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
552852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (GetCompleteType ())
55291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
553052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
553152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const RecordDecl *record_decl = record_type->getDecl();
55321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            assert(record_decl);
55331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t field_bit_offset = 0;
55341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t field_byte_offset = 0;
553552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl);
55361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t child_idx = 0;
55371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
553852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
55391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (cxx_record_decl)
55401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
55411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // We might have base classes to print out first
554252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
55431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
55441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                     base_class != base_class_end;
55451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                     ++base_class)
55461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
554752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
55481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
55491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Skip empty base classes
55501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
55511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        continue;
55521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
55531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (base_class->isVirtual())
5554a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                        field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
55551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else
5556a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                        field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
55571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    field_byte_offset = field_bit_offset / 8;
55581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    assert (field_bit_offset % 8 == 0);
55591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (child_idx == 0)
55601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        s->PutChar('{');
55611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else
55621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        s->PutChar(',');
55631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
556452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    QualType base_class_qual_type = base_class->getType();
55651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    std::string base_class_type_name(base_class_qual_type.getAsString());
55661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
55671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Indent and print the base class type name
55681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
55691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
557052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    std::pair<uint64_t, unsigned> base_class_type_info = m_ast->getTypeInfo(base_class_qual_type);
55711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
55721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Dump the value of the member
557352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType base_clang_type(m_ast, base_class_qual_type);
557452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    base_clang_type.DumpValue (exe_ctx,
557552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               s,                                   // Stream to dump to
557652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               base_clang_type.GetFormat(),         // The format with which to display the member
557752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               data,                                // Data buffer containing all bytes for this type
557852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
557952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               base_class_type_info.first / 8,      // Size of this type in bytes
558052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               0,                                   // Bitfield bit size
558152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               0,                                   // Bitfield bit offset
558252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               show_types,                          // Boolean indicating if we should show the variable types
558352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               show_summary,                        // Boolean indicating if we should show a summary for the current type
558452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               verbose,                             // Verbose output?
558552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               depth + DEPTH_INCREMENT);            // Scope depth for any types that have children
55861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
55871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    ++child_idx;
55881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
55891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
55901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t field_idx = 0;
559152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            RecordDecl::field_iterator field, field_end;
55921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
55931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
55941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Print the starting squiggly bracket (if this is the
55951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // first member) or comman (for member 2 and beyong) for
55961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // the struct/union/class member.
55971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (child_idx == 0)
55981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    s->PutChar('{');
55991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
56001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    s->PutChar(',');
56011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Indent
56031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
56041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
560552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                QualType field_type = field->getType();
56061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Print the member type if requested
56071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Figure out the type byte size (field_type_info.first) and
56081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // alignment (field_type_info.second) from the AST context.
560952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                std::pair<uint64_t, unsigned> field_type_info = m_ast->getTypeInfo(field_type);
56101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                assert(field_idx < record_layout.getFieldCount());
56111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Figure out the field offset within the current struct/union/class type
56121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                field_bit_offset = record_layout.getFieldOffset (field_idx);
56131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                field_byte_offset = field_bit_offset / 8;
56141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                uint32_t field_bitfield_bit_size = 0;
56151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                uint32_t field_bitfield_bit_offset = 0;
561652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (ClangASTContext::FieldIsBitfield (m_ast, *field, field_bitfield_bit_size))
56171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    field_bitfield_bit_offset = field_bit_offset % 8;
56181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (show_types)
56201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
56211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    std::string field_type_name(field_type.getAsString());
56221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (field_bitfield_bit_size > 0)
56231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
56241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else
56251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        s->Printf("(%s) ", field_type_name.c_str());
56261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
56271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Print the member name and equal sign
56281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                s->Printf("%s = ", field->getNameAsString().c_str());
56291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Dump the value of the member
563252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType field_clang_type (m_ast, field_type);
563352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                field_clang_type.DumpValue (exe_ctx,
563452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            s,                              // Stream to dump to
563552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            field_clang_type.GetFormat(),   // The format with which to display the member
563652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            data,                           // Data buffer containing all bytes for this type
563752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
563852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            field_type_info.first / 8,      // Size of this type in bytes
563952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            field_bitfield_bit_size,        // Bitfield bit size
564052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            field_bitfield_bit_offset,      // Bitfield bit offset
564152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            show_types,                     // Boolean indicating if we should show the variable types
564252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            show_summary,                   // Boolean indicating if we should show a summary for the current type
564352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            verbose,                        // Verbose output?
564452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            depth + DEPTH_INCREMENT);       // Scope depth for any types that have children
56451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
56461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            // Indent the trailing squiggly bracket
56481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (child_idx > 0)
56491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                s->Printf("\n%*s}", depth, "");
56501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
56511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return;
56521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Enum:
565452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (GetCompleteType ())
56551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
565652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const EnumType *enum_type = cast<EnumType>(qual_type.getTypePtr());
565752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const EnumDecl *enum_decl = enum_type->getDecl();
56581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            assert(enum_decl);
565952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
566036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            lldb::offset_t offset = data_byte_offset;
56611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
56621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
56631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
56641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (enum_pos->getInitVal() == enum_value)
56651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
566647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                    s->Printf("%s", enum_pos->getNameAsString().c_str());
56671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return;
56681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
56691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
56701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            // If we have gotten here we didn't get find the enumerator in the
56711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            // enum decl, so just print the integer.
56725f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            s->Printf("%" PRIi64, enum_value);
56731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
56741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return;
56751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
56771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
567852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr());
56791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            bool is_array_of_characters = false;
568052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType element_qual_type = array->getElementType();
56811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
5682d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
56831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (canonical_type)
56841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                is_array_of_characters = canonical_type->isCharType();
56851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            const uint64_t element_count = array->getSize().getLimitedValue();
56871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
568852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            std::pair<uint64_t, unsigned> field_type_info = m_ast->getTypeInfo(element_qual_type);
56891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t element_idx = 0;
56911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t element_offset = 0;
56921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint64_t element_byte_size = field_type_info.first / 8;
56931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint32_t element_stride = element_byte_size;
56941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
56951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (is_array_of_characters)
56961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
56971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                s->PutChar('"');
56981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
56991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                s->PutChar('"');
57001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                return;
57011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
57021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            else
57031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
570452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType element_clang_type(m_ast, element_qual_type);
570552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                lldb::Format element_format = element_clang_type.GetFormat();
57061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
57071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                for (element_idx = 0; element_idx < element_count; ++element_idx)
57081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
57091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Print the starting squiggly bracket (if this is the
57101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // first member) or comman (for member 2 and beyong) for
57111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // the struct/union/class member.
57121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (element_idx == 0)
57131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        s->PutChar('{');
57141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else
57151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        s->PutChar(',');
57161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
57171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Indent and print the index
57181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
57191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
57201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Figure out the field offset within the current struct/union/class type
57211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    element_offset = element_idx * element_stride;
57221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
57231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    // Dump the value of the member
572452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    element_clang_type.DumpValue (exe_ctx,
572552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  s,                              // Stream to dump to
572652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  element_format,                 // The format with which to display the element
572752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  data,                           // Data buffer containing all bytes for this type
572852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  data_byte_offset + element_offset,// Offset into "data" where to grab value from
572952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  element_byte_size,              // Size of this type in bytes
573052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  0,                              // Bitfield bit size
573152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  0,                              // Bitfield bit offset
573252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  show_types,                     // Boolean indicating if we should show the variable types
573352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  show_summary,                   // Boolean indicating if we should show a summary for the current type
573452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  verbose,                        // Verbose output?
573552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                  depth + DEPTH_INCREMENT);       // Scope depth for any types that have children
57361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
57371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
57381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                // Indent the trailing squiggly bracket
57391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (element_idx > 0)
57401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    s->Printf("\n%*s}", depth, "");
57411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
57421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
57431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return;
57441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
57451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
57461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
574752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType typedef_qual_type = cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType();
574852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
574952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType typedef_clang_type (m_ast, typedef_qual_type);
575052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            lldb::Format typedef_format = typedef_clang_type.GetFormat();
575152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            std::pair<uint64_t, unsigned> typedef_type_info = m_ast->getTypeInfo(typedef_qual_type);
57521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            uint64_t typedef_byte_size = typedef_type_info.first / 8;
57531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
575452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return typedef_clang_type.DumpValue (exe_ctx,
575552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 s,                  // Stream to dump to
575652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 typedef_format,     // The format with which to display the element
575752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 data,               // Data buffer containing all bytes for this type
575852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 data_byte_offset,   // Offset into "data" where to grab value from
575952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 typedef_byte_size,  // Size of this type in bytes
576052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 bitfield_bit_size,  // Bitfield bit size
576152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 bitfield_bit_offset,// Bitfield bit offset
576252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 show_types,         // Boolean indicating if we should show the variable types
576352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 show_summary,       // Boolean indicating if we should show a summary for the current type
576452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 verbose,            // Verbose output?
576552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 depth);             // Scope depth for any types that have children
57661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
57671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        break;
57681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
576919b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton    case clang::Type::Elaborated:
577019b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton        {
577152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType elaborated_qual_type = cast<ElaboratedType>(qual_type)->getNamedType();
577252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType elaborated_clang_type (m_ast, elaborated_qual_type);
577352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
577452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            std::pair<uint64_t, unsigned> elaborated_type_info = m_ast->getTypeInfo(elaborated_qual_type);
577519b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton            uint64_t elaborated_byte_size = elaborated_type_info.first / 8;
577619b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton
577752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return elaborated_clang_type.DumpValue (exe_ctx,
577852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    s,                  // Stream to dump to
577952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    elaborated_format,  // The format with which to display the element
578052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    data,               // Data buffer containing all bytes for this type
578152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    data_byte_offset,   // Offset into "data" where to grab value from
578252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    elaborated_byte_size,  // Size of this type in bytes
578352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    bitfield_bit_size,  // Bitfield bit size
578452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    bitfield_bit_offset,// Bitfield bit offset
578552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    show_types,         // Boolean indicating if we should show the variable types
578652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    show_summary,       // Boolean indicating if we should show a summary for the current type
578752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    verbose,            // Verbose output?
578852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    depth);             // Scope depth for any types that have children
578919b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton        }
579019b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton        break;
5791efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata
5792efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata    case clang::Type::Paren:
579352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
579452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            QualType desugar_qual_type = cast<ParenType>(qual_type)->desugar();
579552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType desugar_clang_type (m_ast, desugar_qual_type);
579652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
579752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            lldb::Format desugar_format = desugar_clang_type.GetFormat();
579852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            std::pair<uint64_t, unsigned> desugar_type_info = m_ast->getTypeInfo(desugar_qual_type);
579952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            uint64_t desugar_byte_size = desugar_type_info.first / 8;
580052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
580152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return desugar_clang_type.DumpValue (exe_ctx,
580252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 s,                  // Stream to dump to
580352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 desugar_format,  // The format with which to display the element
580452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 data,               // Data buffer containing all bytes for this type
580552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 data_byte_offset,   // Offset into "data" where to grab value from
580652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 desugar_byte_size,  // Size of this type in bytes
580752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 bitfield_bit_size,  // Bitfield bit size
580852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 bitfield_bit_offset,// Bitfield bit offset
580952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 show_types,         // Boolean indicating if we should show the variable types
581052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 show_summary,       // Boolean indicating if we should show a summary for the current type
581152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 verbose,            // Verbose output?
581252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                 depth);             // Scope depth for any types that have children
581352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
5814efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata        break;
5815efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata
58161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    default:
58171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        // We are down the a scalar type that we just need to display.
581852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        data.Dump(s,
581952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  data_byte_offset,
582052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  format,
582152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  data_byte_size,
582252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  1,
582352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  UINT32_MAX,
582452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  LLDB_INVALID_ADDRESS,
582552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  bitfield_bit_size,
582652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                  bitfield_bit_offset);
58271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
58281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        if (show_summary)
582952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            DumpSummary (exe_ctx, s, data, data_byte_offset, data_byte_size);
58301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        break;
58311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
58321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
58331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
58341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
58351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
58361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
58371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool
583852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpTypeValue (Stream *s,
583924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                             lldb::Format format,
584024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                             const lldb_private::DataExtractor &data,
5841fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                             lldb::offset_t byte_offset,
584224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                             size_t byte_size,
584324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                             uint32_t bitfield_bit_size,
584424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                             uint32_t bitfield_bit_offset,
584524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                             ExecutionContextScope *exe_scope)
58461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
584752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
584852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
584952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsAggregateType())
58501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
585152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
58521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
58531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    else
58541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
585552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetQualType());
585652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
58579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
58589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        switch (type_class)
58591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
5860e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton        case clang::Type::Typedef:
5861e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            {
586252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                QualType typedef_qual_type = cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType();
586352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType typedef_clang_type (m_ast, typedef_qual_type);
5864e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                if (format == eFormatDefault)
586552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    format = typedef_clang_type.GetFormat();
586652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                std::pair<uint64_t, unsigned> typedef_type_info = m_ast->getTypeInfo(typedef_qual_type);
5867e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                uint64_t typedef_byte_size = typedef_type_info.first / 8;
5868e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton
586952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return typedef_clang_type.DumpTypeValue (s,
587052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         format,                 // The format with which to display the element
587152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         data,                   // Data buffer containing all bytes for this type
587252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         byte_offset,            // Offset into "data" where to grab value from
587352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         typedef_byte_size,      // Size of this type in bytes
587452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         bitfield_bit_size,      // Size in bits of a bitfield value, if zero don't treat as a bitfield
587552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         bitfield_bit_offset,    // Offset in bits of a bitfield value if bitfield_bit_size != 0
587652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                         exe_scope);
5877e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            }
5878e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            break;
5879e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton
58801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Enum:
5881e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            // If our format is enum or default, show the enumeration value as
5882e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            // its enumeration string value, else just display it as requested.
588352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType ())
58841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
588552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const EnumType *enum_type = cast<EnumType>(qual_type.getTypePtr());
588652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const EnumDecl *enum_decl = enum_type->getDecl();
58871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                assert(enum_decl);
588852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5889d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
589036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                lldb::offset_t offset = byte_offset;
5891d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                if (is_signed)
58921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
5893d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
5894d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
58951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
5896d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                        if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
5897d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                        {
5898d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                            s->PutCString (enum_pos->getNameAsString().c_str());
5899d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                            return true;
5900d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                        }
59011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
5902d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    // If we have gotten here we didn't get find the enumerator in the
5903d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    // enum decl, so just print the integer.
5904d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    s->Printf("%" PRIi64, enum_svalue);
5905d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                }
5906d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                else
5907d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                {
5908d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
5909d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5910d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    {
5911d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                        if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
5912d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                        {
5913d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                            s->PutCString (enum_pos->getNameAsString().c_str());
5914d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                            return true;
5915d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                        }
5916d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    }
5917d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    // If we have gotten here we didn't get find the enumerator in the
5918d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    // enum decl, so just print the integer.
5919d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton                    s->Printf("%" PRIu64, enum_uvalue);
59201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
59211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                return true;
59221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
5923e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            // format was not enum, just fall through and dump the value as requested....
5924e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton
59251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        default:
59261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            // We are down the a scalar type that we just need to display.
5927e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            {
5928e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                uint32_t item_count = 1;
5929e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                // A few formats, we might need to modify our size and count for depending
5930e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                // on how we are trying to display the value...
5931e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                switch (format)
5932e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                {
5933e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    default:
5934e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatBoolean:
5935e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatBinary:
5936e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatComplex:
5937e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatCString:         // NULL terminated C strings
5938e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatDecimal:
5939e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatEnum:
5940e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatHex:
5941535543d6104ee45b4503db6bb6c175e66d0e093bEnrico Granata                    case eFormatHexUppercase:
5942e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatFloat:
5943e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatOctal:
5944e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatOSType:
5945e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatUnsigned:
5946e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatPointer:
5947e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfChar:
5948e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfSInt8:
5949e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfUInt8:
5950e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfSInt16:
5951e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfUInt16:
5952e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfSInt32:
5953e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfUInt32:
5954e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfSInt64:
5955e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfUInt64:
5956e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfFloat32:
5957e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfFloat64:
5958e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatVectorOfUInt128:
5959e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        break;
5960e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton
5961e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatChar:
5962e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatCharPrintable:
5963307fa07606d519d427c812802aff5f9727e7047cGreg Clayton                    case eFormatCharArray:
5964e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatBytes:
5965e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatBytesWithASCII:
5966cebe96537a98c95f375cf81ac1c37dd082b4520bJohnny Chen                        item_count = byte_size;
5967e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        byte_size = 1;
5968e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        break;
5969e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton
5970e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatUnicode16:
5971cebe96537a98c95f375cf81ac1c37dd082b4520bJohnny Chen                        item_count = byte_size / 2;
5972e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        byte_size = 2;
5973e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        break;
5974e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton
5975e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                    case eFormatUnicode32:
5976cebe96537a98c95f375cf81ac1c37dd082b4520bJohnny Chen                        item_count = byte_size / 4;
5977e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        byte_size = 4;
5978e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                        break;
5979e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                }
5980e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                return data.Dump (s,
5981e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  byte_offset,
5982e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  format,
5983e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  byte_size,
5984e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  item_count,
5985e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  UINT32_MAX,
5986e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  LLDB_INVALID_ADDRESS,
5987e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton                                  bitfield_bit_size,
598824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                                  bitfield_bit_offset,
598924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton                                  exe_scope);
5990e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton            }
59911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
59921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
59931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
59941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    return 0;
59951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
59961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
59971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
59981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
59991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonvoid
600052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpSummary (ExecutionContext *exe_ctx,
600152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           Stream *s,
600252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           const lldb_private::DataExtractor &data,
600352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           lldb::offset_t data_byte_offset,
600452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           size_t data_byte_size)
60051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
60061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    uint32_t length = 0;
600752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsCStringType (length))
60081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
6009567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (exe_ctx)
60101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
6011567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Process *process = exe_ctx->GetProcessPtr();
6012567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process)
60131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
601436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                lldb::offset_t offset = data_byte_offset;
6015567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t pointer_addresss = data.GetMaxU64(&offset, data_byte_size);
6016567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                std::vector<uint8_t> buf;
6017567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (length > 0)
6018567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    buf.resize (length);
6019567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                else
6020567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    buf.resize (256);
6021567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
6022567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
6023567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                buf.back() = '\0';
6024567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                size_t bytes_read;
6025567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                size_t total_cstr_len = 0;
6026567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error error;
6027567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                while ((bytes_read = process->ReadMemory (pointer_addresss, &buf.front(), buf.size(), error)) > 0)
6028567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                {
6029567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    const size_t len = strlen((const char *)&buf.front());
6030567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    if (len == 0)
6031567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        break;
6032567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    if (total_cstr_len == 0)
6033567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        s->PutCString (" \"");
6034567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
6035567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    total_cstr_len += len;
6036567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    if (len < buf.size())
6037567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        break;
6038567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    pointer_addresss += total_cstr_len;
6039567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                }
6040567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (total_cstr_len > 0)
6041567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    s->PutChar ('"');
60421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
60431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
60441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
60451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
60461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6047960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonvoid
604852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpTypeDescription () const
6049133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton{
6050133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton    StreamFile s (stdout, false);
6051133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton    DumpTypeDescription (&s);
6052017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    ClangASTMetadata *metadata = ClangASTContext::GetMetadata (m_ast, m_type);
6053017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    if (metadata)
6054017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    {
6055017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton        metadata->Dump (&s);
6056017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton    }
6057133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton}
6058133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton
6059133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Claytonvoid
606052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpTypeDescription (Stream *s) const
6061960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
606252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsValid())
6063960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    {
606452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        QualType qual_type(GetQualType());
6065960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
606652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        SmallVector<char, 1024> buf;
606752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        raw_svector_ostream llvm_ostrm (buf);
6068960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
606996154be69fa240a662419183ed08e1cfc5418164Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
607096154be69fa240a662419183ed08e1cfc5418164Greg Clayton        switch (type_class)
6071960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
607296154be69fa240a662419183ed08e1cfc5418164Greg Clayton        case clang::Type::ObjCObject:
607396154be69fa240a662419183ed08e1cfc5418164Greg Clayton        case clang::Type::ObjCInterface:
6074960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
607552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                GetCompleteType ();
6076017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton
607752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
607896154be69fa240a662419183ed08e1cfc5418164Greg Clayton                assert (objc_class_type);
607996154be69fa240a662419183ed08e1cfc5418164Greg Clayton                if (objc_class_type)
6080960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
608152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
608296154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    if (class_interface_decl)
6083009a430d4d65984e0d33850686dd7b7a7a4a35bdSean Callanan                    {
608452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        PrintingPolicy policy = m_ast->getPrintingPolicy();
6085009a430d4d65984e0d33850686dd7b7a7a4a35bdSean Callanan                        class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
6086009a430d4d65984e0d33850686dd7b7a7a4a35bdSean Callanan                    }
6087960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
608896154be69fa240a662419183ed08e1cfc5418164Greg Clayton            }
608996154be69fa240a662419183ed08e1cfc5418164Greg Clayton            break;
609096154be69fa240a662419183ed08e1cfc5418164Greg Clayton
609196154be69fa240a662419183ed08e1cfc5418164Greg Clayton        case clang::Type::Typedef:
609296154be69fa240a662419183ed08e1cfc5418164Greg Clayton            {
609352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
609496154be69fa240a662419183ed08e1cfc5418164Greg Clayton                if (typedef_type)
6095960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
609652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    const TypedefNameDecl *typedef_decl = typedef_type->getDecl();
609796154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
609896154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    if (!clang_typedef_name.empty())
6099960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
610096154be69fa240a662419183ed08e1cfc5418164Greg Clayton                        s->PutCString ("typedef ");
610196154be69fa240a662419183ed08e1cfc5418164Greg Clayton                        s->PutCString (clang_typedef_name.c_str());
6102960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
6103960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
610496154be69fa240a662419183ed08e1cfc5418164Greg Clayton            }
610596154be69fa240a662419183ed08e1cfc5418164Greg Clayton            break;
610696154be69fa240a662419183ed08e1cfc5418164Greg Clayton
610719b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton        case clang::Type::Elaborated:
610852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
610919b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton            return;
611019b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton
6111efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata        case clang::Type::Paren:
611252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
6113efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata            return;
6114efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata
611596154be69fa240a662419183ed08e1cfc5418164Greg Clayton        case clang::Type::Record:
611696154be69fa240a662419183ed08e1cfc5418164Greg Clayton            {
611752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                GetCompleteType ();
6118017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton
611952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
612052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const RecordDecl *record_decl = record_type->getDecl();
612152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
612296154be69fa240a662419183ed08e1cfc5418164Greg Clayton
612396154be69fa240a662419183ed08e1cfc5418164Greg Clayton                if (cxx_record_decl)
612452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    cxx_record_decl->print(llvm_ostrm, m_ast->getPrintingPolicy(), s->GetIndentLevel());
612596154be69fa240a662419183ed08e1cfc5418164Greg Clayton                else
612652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    record_decl->print(llvm_ostrm, m_ast->getPrintingPolicy(), s->GetIndentLevel());
612796154be69fa240a662419183ed08e1cfc5418164Greg Clayton            }
612896154be69fa240a662419183ed08e1cfc5418164Greg Clayton            break;
6129960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
613096154be69fa240a662419183ed08e1cfc5418164Greg Clayton        default:
613196154be69fa240a662419183ed08e1cfc5418164Greg Clayton            {
613252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr());
613396154be69fa240a662419183ed08e1cfc5418164Greg Clayton                if (tag_type)
613496154be69fa240a662419183ed08e1cfc5418164Greg Clayton                {
613552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    TagDecl *tag_decl = tag_type->getDecl();
613696154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    if (tag_decl)
613796154be69fa240a662419183ed08e1cfc5418164Greg Clayton                        tag_decl->print(llvm_ostrm, 0);
613896154be69fa240a662419183ed08e1cfc5418164Greg Clayton                }
613996154be69fa240a662419183ed08e1cfc5418164Greg Clayton                else
6140960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
6141960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    std::string clang_type_name(qual_type.getAsString());
6142960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (!clang_type_name.empty())
6143960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        s->PutCString (clang_type_name.c_str());
6144960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
6145960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
6146960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
6147960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
6148960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        llvm_ostrm.flush();
6149960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        if (buf.size() > 0)
6150960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
6151960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            s->Write (buf.data(), buf.size());
6152960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
6153960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    }
6154960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
6155960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
61561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool
615752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetValueAsScalar (const lldb_private::DataExtractor &data,
615852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                lldb::offset_t data_byte_offset,
615952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                size_t data_byte_size,
616052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                Scalar &value) const
61611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
616252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
616352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
61641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
616552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (IsAggregateType ())
61661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
61671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return false;   // Aggregate types don't have scalar values
61681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
61691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    else
61701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
6171fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton        uint64_t count = 0;
617252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        lldb::Encoding encoding = GetEncoding (count);
61731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
61741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        if (encoding == lldb::eEncodingInvalid || count != 1)
61751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            return false;
61761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
617752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const uint64_t byte_size = GetByteSize();
617836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = data_byte_offset;
61791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        switch (encoding)
61801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
6181279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        case lldb::eEncodingInvalid:
6182279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
6183279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        case lldb::eEncodingVector:
6184279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
61851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case lldb::eEncodingUint:
61861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (byte_size <= sizeof(unsigned long long))
61871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
61881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                uint64_t uval64 = data.GetMaxU64 (&offset, byte_size);
61891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size <= sizeof(unsigned int))
61901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
61911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value = (unsigned int)uval64;
61921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
61931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
61941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else if (byte_size <= sizeof(unsigned long))
61951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
61961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value = (unsigned long)uval64;
61971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
61981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
61991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else if (byte_size <= sizeof(unsigned long long))
62001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value = (unsigned long long )uval64;
62021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
62031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
62051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value.Clear();
62061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
62071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
62081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
62091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case lldb::eEncodingSint:
62101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (byte_size <= sizeof(long long))
62111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
62124a19f588474a658b18338eff7ba665ca9766e1c7Sean Callanan                int64_t sval64 = data.GetMaxS64 (&offset, byte_size);
62131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size <= sizeof(int))
62141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value = (int)sval64;
62161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
62171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else if (byte_size <= sizeof(long))
62191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value = (long)sval64;
62211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
62221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else if (byte_size <= sizeof(long long))
62241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value = (long long )sval64;
62261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
62271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
62291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    value.Clear();
62301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
62311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
62321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
62331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case lldb::eEncodingIEEE754:
62341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (byte_size <= sizeof(long double))
62351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
62361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                uint32_t u32;
62371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                uint64_t u64;
62381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size == sizeof(float))
62391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (sizeof(float) == sizeof(uint32_t))
62411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
62421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        u32 = data.GetU32(&offset);
62431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        value = *((float *)&u32);
62441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        return true;
62451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
62461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else if (sizeof(float) == sizeof(uint64_t))
62471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
62481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        u64 = data.GetU64(&offset);
62491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        value = *((float *)&u64);
62501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        return true;
62511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
62521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
62541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size == sizeof(double))
62551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (sizeof(double) == sizeof(uint32_t))
62571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
62581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        u32 = data.GetU32(&offset);
62591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        value = *((double *)&u32);
62601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        return true;
62611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
62621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else if (sizeof(double) == sizeof(uint64_t))
62631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
62641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        u64 = data.GetU64(&offset);
62651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        value = *((double *)&u64);
62661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        return true;
62671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
62681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
62701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size == sizeof(long double))
62711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
62721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    if (sizeof(long double) == sizeof(uint32_t))
62731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
62741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        u32 = data.GetU32(&offset);
62751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        value = *((long double *)&u32);
62761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        return true;
62771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
62781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    else if (sizeof(long double) == sizeof(uint64_t))
62791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    {
62801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        u64 = data.GetU64(&offset);
62811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        value = *((long double *)&u64);
62821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                        return true;
62831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    }
62841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
62851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
62861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
62871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
62881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
62891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    return false;
62901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
62911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
62921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool
62931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg ClaytonClangASTType::SetValueFromScalar (const Scalar &value, Stream &strm)
62941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
62951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    // Aggregate types don't have scalar values
629652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsAggregateType ())
62971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
62981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        strm.GetFlags().Set(Stream::eBinary);
6299fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton        uint64_t count = 0;
630052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        lldb::Encoding encoding = GetEncoding (count);
63011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
63021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        if (encoding == lldb::eEncodingInvalid || count != 1)
63031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            return false;
63041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
630552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const uint64_t bit_width = GetBitSize();
63061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        // This function doesn't currently handle non-byte aligned assignments
63071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        if ((bit_width % 8) != 0)
63081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            return false;
63091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
6310fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton        const uint64_t byte_size = (bit_width + 7 ) / 8;
63111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        switch (encoding)
63121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
6313279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        case lldb::eEncodingInvalid:
6314279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
6315279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        case lldb::eEncodingVector:
6316279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
63171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case lldb::eEncodingUint:
63181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            switch (byte_size)
63191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
63201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 1: strm.PutHex8(value.UInt()); return true;
63211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 2: strm.PutHex16(value.UInt()); return true;
63221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 4: strm.PutHex32(value.UInt()); return true;
63231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 8: strm.PutHex64(value.ULongLong()); return true;
63241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            default:
63251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                break;
63261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
63271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
63281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
63291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case lldb::eEncodingSint:
63301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            switch (byte_size)
63311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
63321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 1: strm.PutHex8(value.SInt()); return true;
63331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 2: strm.PutHex16(value.SInt()); return true;
63341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 4: strm.PutHex32(value.SInt()); return true;
63351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case 8: strm.PutHex64(value.SLongLong()); return true;
63361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            default:
63371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                break;
63381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
63391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
63401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
63411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case lldb::eEncodingIEEE754:
63421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            if (byte_size <= sizeof(long double))
63431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
63441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size == sizeof(float))
63451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
63461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    strm.PutFloat(value.Float());
63471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
63481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
63491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
63501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size == sizeof(double))
63511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
63521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    strm.PutDouble(value.Double());
63531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
63541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
63551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                else
63561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                if (byte_size == sizeof(long double))
63571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                {
63581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    strm.PutDouble(value.LongDouble());
63591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    return true;
63601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                }
63611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
63621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            break;
63631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
63641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
63651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    return false;
63661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
63671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
63681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool
6369fe6dc6e241c52822710380cec0931351a1d7b2d3Greg ClaytonClangASTType::ReadFromMemory (lldb_private::ExecutionContext *exe_ctx,
6370fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                              lldb::addr_t addr,
6371fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                              AddressType address_type,
6372fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton                              lldb_private::DataExtractor &data)
63731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
637452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
637552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
63761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
637752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Can't convert a file address to anything valid without more
637852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // context (which Module it came from)
6379b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    if (address_type == eAddressTypeFile)
63801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return false;
63818f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
638252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!GetCompleteType())
63838f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return false;
63848f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
638552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint64_t byte_size = GetByteSize();
63861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    if (data.GetByteSize() < byte_size)
63871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
63881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
63891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        data.SetData(data_sp);
63901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
639152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
63921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size);
63931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    if (dst != NULL)
63941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
6395b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        if (address_type == eAddressTypeHost)
63961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
639772374e3009feb87332542f60d72b92343c9b35faEnrico Granata            if (addr == 0)
639872374e3009feb87332542f60d72b92343c9b35faEnrico Granata                return false;
63991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            // The address is an address in this process, so just copy it
64001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            memcpy (dst, (uint8_t*)NULL + addr, byte_size);
64011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            return true;
64021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
64031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        else
64041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
6405567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Process *process = NULL;
6406567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (exe_ctx)
6407567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process = exe_ctx->GetProcessPtr();
6408567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process)
64091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
64101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                Error error;
6411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                return process->ReadMemory(addr, dst, byte_size, error) == byte_size;
64121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
64131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
64141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
64151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    return false;
64161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
64171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
64181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool
641952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::WriteToMemory (lldb_private::ExecutionContext *exe_ctx,
642052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             lldb::addr_t addr,
642152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             AddressType address_type,
642252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             StreamString &new_value)
64231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{
642452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!IsValid())
642552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
64261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
642752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Can't convert a file address to anything valid without more
642852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // context (which Module it came from)
6429b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    if (address_type == eAddressTypeFile)
64301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        return false;
643152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
643252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!GetCompleteType())
643352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
643452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
643552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint64_t byte_size = GetByteSize();
64361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
64371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    if (byte_size > 0)
64381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    {
6439b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        if (address_type == eAddressTypeHost)
64401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
64411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            // The address is an address in this process, so just copy it
64421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            memcpy ((void *)addr, new_value.GetData(), byte_size);
64431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            return true;
64441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
64451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        else
64461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        {
6447567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Process *process = NULL;
6448567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (exe_ctx)
6449567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process = exe_ctx->GetProcessPtr();
6450567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process)
64511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            {
64521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                Error error;
6453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                return process->WriteMemory(addr, new_value.GetData(), byte_size, error) == byte_size;
64541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            }
64551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        }
64561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    }
64571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    return false;
64581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton}
64591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
64601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
646152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//CXXRecordDecl *
646252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//ClangASTType::GetAsCXXRecordDecl (lldb::clang_type_t opaque_clang_qual_type)
646352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//{
646452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    if (opaque_clang_qual_type)
646552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//        return QualType::getFromOpaquePtr(opaque_clang_qual_type)->getAsCXXRecordDecl();
646652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    return NULL;
646752f792329be5db8e38961350589e97e8f2823acdGreg Clayton//}
64680fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
64690fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonbool
64700fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonlldb_private::operator == (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs)
64710fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton{
64720fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    return lhs.GetASTContext() == rhs.GetASTContext() && lhs.GetOpaqueQualType() == rhs.GetOpaqueQualType();
64730fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton}
64740fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
64750fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
64760fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonbool
64770fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonlldb_private::operator != (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs)
64780fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton{
64790fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    return lhs.GetASTContext() != rhs.GetASTContext() || lhs.GetOpaqueQualType() != rhs.GetOpaqueQualType();
64800fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton}
64810b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
64820b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
6483