ClangASTContext.cpp revision a83f8779ac614263d92959d2338e6e9f08d8f9fb
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include "lldb/Symbol/ClangASTContext.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
17b01000fd063629facd45044f137446fb748ee179Greg Clayton
18b01000fd063629facd45044f137446fb748ee179Greg Clayton// Clang headers like to use NDEBUG inside of them to enable/disable debug
19b01000fd063629facd45044f137446fb748ee179Greg Clayton// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
20b01000fd063629facd45044f137446fb748ee179Greg Clayton// or another. This is bad because it means that if clang was built in release
21b01000fd063629facd45044f137446fb748ee179Greg Clayton// mode, it assumes that you are building in release mode which is not always
22b01000fd063629facd45044f137446fb748ee179Greg Clayton// the case. You can end up with functions that are defined as empty in header
23b01000fd063629facd45044f137446fb748ee179Greg Clayton// files when NDEBUG is not defined, and this can cause link errors with the
24b01000fd063629facd45044f137446fb748ee179Greg Clayton// clang .a files that you have since you might be missing functions in the .a
25b01000fd063629facd45044f137446fb748ee179Greg Clayton// file. So we have to define NDEBUG when including clang headers to avoid any
26b01000fd063629facd45044f137446fb748ee179Greg Clayton// mismatches. This is covered by rdar://problem/8691220
27b01000fd063629facd45044f137446fb748ee179Greg Clayton
28b01000fd063629facd45044f137446fb748ee179Greg Clayton#ifndef NDEBUG
29b01000fd063629facd45044f137446fb748ee179Greg Clayton#define LLDB_DEFINED_NDEBUG_FOR_CLANG
30bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#define NDEBUG
31b01000fd063629facd45044f137446fb748ee179Greg Clayton// Need to include assert.h so it is as clang would expect it to be (disabled)
32b01000fd063629facd45044f137446fb748ee179Greg Clayton#include <assert.h>
33b01000fd063629facd45044f137446fb748ee179Greg Clayton#endif
34b01000fd063629facd45044f137446fb748ee179Greg Clayton
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTImporter.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/CXXInheritance.h"
3884f8075072eef306234f8109573067647735c111Greg Clayton#include "clang/AST/DeclObjC.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h"
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h"
438a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan#include "clang/Basic/FileSystemOptions.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h"
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h"
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h"
49b01000fd063629facd45044f137446fb748ee179Greg Clayton
50b01000fd063629facd45044f137446fb748ee179Greg Clayton#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
51bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG
52b01000fd063629facd45044f137446fb748ee179Greg Clayton#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
53b01000fd063629facd45044f137446fb748ee179Greg Clayton// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
54b01000fd063629facd45044f137446fb748ee179Greg Clayton#include <assert.h>
55b01000fd063629facd45044f137446fb748ee179Greg Clayton#endif
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Core/ArchSpec.h"
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
59f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h"
60839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h"
6158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/ExecutionContext.h"
6258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/Process.h"
6358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
6458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
67f05633b35544b5d095feb05680c8728be087e441Eli Friedman
68585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73b01000fd063629facd45044f137446fb748ee179Greg Clayton
74b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic bool
75b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
76b01000fd063629facd45044f137446fb748ee179Greg Clayton{
77b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
78b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
79b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
80b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
81b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
82b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
83d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
84b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (tag_type)
85b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
86b01000fd063629facd45044f137446fb748ee179Greg Clayton                clang::TagDecl *tag_decl = tag_type->getDecl();
87b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (tag_decl)
88b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
89b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (tag_decl->getDefinition())
90b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return true;
91b01000fd063629facd45044f137446fb748ee179Greg Clayton
92b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (tag_decl->hasExternalLexicalStorage())
93b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
9482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (ast)
95b01000fd063629facd45044f137446fb748ee179Greg Clayton                        {
9682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            ExternalASTSource *external_ast_source = ast->getExternalSource();
9782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            if (external_ast_source)
9882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            {
9982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                external_ast_source->CompleteType(tag_decl);
10082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                return !tag_type->isIncompleteType();
10182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            }
102b01000fd063629facd45044f137446fb748ee179Greg Clayton                        }
103b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
104b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return false;
105b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
106b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
107b01000fd063629facd45044f137446fb748ee179Greg Clayton
108b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
109b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
110b01000fd063629facd45044f137446fb748ee179Greg Clayton
111b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
112b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
113b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
114d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
115b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
116b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
117b01000fd063629facd45044f137446fb748ee179Greg Clayton                clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
118b01000fd063629facd45044f137446fb748ee179Greg Clayton                // We currently can't complete objective C types through the newly added ASTContext
119b01000fd063629facd45044f137446fb748ee179Greg Clayton                // because it only supports TagDecl objects right now...
12090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                if (class_interface_decl)
121b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
122886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    bool is_forward_decl = class_interface_decl->isForwardDecl();
123886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
124b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
125886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        if (ast)
12682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
127886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            ExternalASTSource *external_ast_source = ast->getExternalSource();
128886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            if (external_ast_source)
129886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            {
130886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                external_ast_source->CompleteType (class_interface_decl);
131886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                is_forward_decl = class_interface_decl->isForwardDecl();
132886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                            }
13382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
134886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        return is_forward_decl == false;
135b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
136886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    return true;
137b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
138886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                else
139886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    return false;
140b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
141b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
142b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
143b01000fd063629facd45044f137446fb748ee179Greg Clayton
144b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
145b01000fd063629facd45044f137446fb748ee179Greg Clayton        return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
146b01000fd063629facd45044f137446fb748ee179Greg Clayton
147b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
148b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
149b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
150b01000fd063629facd45044f137446fb748ee179Greg Clayton
151b01000fd063629facd45044f137446fb748ee179Greg Clayton    return true;
152b01000fd063629facd45044f137446fb748ee179Greg Clayton}
153b01000fd063629facd45044f137446fb748ee179Greg Clayton
154b01000fd063629facd45044f137446fb748ee179Greg Clayton
15584f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
156585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access)
15784f8075072eef306234f8109573067647735c111Greg Clayton{
15884f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
15984f8075072eef306234f8109573067647735c111Greg Clayton    {
160585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
161585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
162585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
163585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
164585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
16584f8075072eef306234f8109573067647735c111Greg Clayton    }
16684f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
16784f8075072eef306234f8109573067647735c111Greg Clayton}
16884f8075072eef306234f8109573067647735c111Greg Clayton
16984f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
170585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
17184f8075072eef306234f8109573067647735c111Greg Clayton{
17284f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
17384f8075072eef306234f8109573067647735c111Greg Clayton    {
174585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
175585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return ObjCIvarDecl::None;
176585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return ObjCIvarDecl::Public;
177585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return ObjCIvarDecl::Private;
178585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return ObjCIvarDecl::Protected;
179585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPackage:   return ObjCIvarDecl::Package;
18084f8075072eef306234f8109573067647735c111Greg Clayton    }
18184f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
18284f8075072eef306234f8109573067647735c111Greg Clayton}
18384f8075072eef306234f8109573067647735c111Greg Clayton
18484f8075072eef306234f8109573067647735c111Greg Clayton
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
189e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
197e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
199e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
200e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
201e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
202e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
211e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
212e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
213279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_LLVM_IR:
214b01000fd063629facd45044f137446fb748ee179Greg Clayton                assert (!"Invalid input kind!");
215e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
218279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_CUDA:
219279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                LangStd = LangStandard::lang_cuda;
220279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                break;
221e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
222e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
223e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
224e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
225e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
228e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
229e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
230e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
231e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
2798950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan        Opts.setVisibilityMode(DefaultVisibility);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
353e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
354b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) :
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
356b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap(),
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
364b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_builtins_ap(),
365b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_tag_decl (NULL),
366b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_objc_decl (NULL),
367b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_baton (NULL)
368b01000fd063629facd45044f137446fb748ee179Greg Clayton
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
371dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton        SetTargetTriple (target_triple);
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
387b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
394b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
416dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton    if (m_target_triple.find("armv7s") == 0)
417dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton        m_target_triple.erase(5,1);
418dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton    else if (m_target_triple.find("armv7f") == 0)
419dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton        m_target_triple.erase(5,1);
420dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton    else if (m_target_triple.find("armv7k") == 0)
421dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton        m_target_triple.erase(5,1);
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
424395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid
425395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch)
426395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{
427dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton    SetTargetTriple(arch.GetTriple().str().c_str());
428395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton}
429395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton
430b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
431b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource ()
432b01000fd063629facd45044f137446fb748ee179Greg Clayton{
433b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
434b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
435b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getExternalSource () != NULL;
436b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
437b01000fd063629facd45044f137446fb748ee179Greg Clayton}
438b01000fd063629facd45044f137446fb748ee179Greg Clayton
439b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
440b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
441b01000fd063629facd45044f137446fb748ee179Greg Clayton{
442b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
443b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
444b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
445b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (ast_source_ap);
446b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
447b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
448b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
449b01000fd063629facd45044f137446fb748ee179Greg Clayton}
450b01000fd063629facd45044f137446fb748ee179Greg Clayton
451b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
452b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource ()
453b01000fd063629facd45044f137446fb748ee179Greg Clayton{
454b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
455b01000fd063629facd45044f137446fb748ee179Greg Clayton
456b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
457b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
458b01000fd063629facd45044f137446fb748ee179Greg Clayton        llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
459b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (empty_ast_source_ap);
460b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
461b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
462b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
463b01000fd063629facd45044f137446fb748ee179Greg Clayton}
464b01000fd063629facd45044f137446fb748ee179Greg Clayton
465b01000fd063629facd45044f137446fb748ee179Greg Clayton
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
470b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get() == NULL)
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
472b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
473b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSourceManager(),
474b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getTargetInfo(),
475b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getIdentifierTable(),
476b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSelectorTable(),
477b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getBuiltinContext(),
478b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       0));
479887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
480b01000fd063629facd45044f137446fb748ee179Greg Clayton        if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
481b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
482b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
483b01000fd063629facd45044f137446fb748ee179Greg Clayton            //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
484b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
485b01000fd063629facd45044f137446fb748ee179Greg Clayton
486b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
488b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast_ap.get();
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
513e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
514e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5278a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
5288a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
5298a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
5308a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
53122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    {
53222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        clang::FileSystemOptions file_system_options;
53322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
53422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    }
5358a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
5368a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
5378a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
5381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
54222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
550eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    {
551eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
552eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
553eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    }
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
557887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient
558887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
559887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic:
560887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    NullDiagnosticClient ()
561887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
562887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
563887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
564887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
565887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
566887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
567887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        if (m_log)
568887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        {
569887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            llvm::SmallVectorImpl<char> diag_str(10);
570887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            info.FormatDiagnostic(diag_str);
571887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            diag_str.push_back('\0');
572887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
573887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        }
574887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
575887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate:
576887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    LogSP m_log;
577887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan};
578887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
579887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient *
580887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient()
581887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
582887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    if (m_diagnostic_client_ap.get() == NULL)
583887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_diagnostic_client_ap.reset(new NullDiagnosticClient);
584887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
585887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    return m_diagnostic_client_ap.get();
586887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}
587887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
613b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
615b01000fd063629facd45044f137446fb748ee179Greg Clayton    uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
621462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
622585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
624b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
626b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
628b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
631462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
632b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
634b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
639585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
640b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
641b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->VoidPtrTy.getAsOpaquePtr();
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
644585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
645b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
646b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedCharTy.getAsOpaquePtr();
647b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
648b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedShortTy.getAsOpaquePtr();
649b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
650b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedIntTy.getAsOpaquePtr();
651b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
652b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongTy.getAsOpaquePtr();
653b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
654b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongLongTy.getAsOpaquePtr();
655b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
656b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedInt128Ty.getAsOpaquePtr();
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
659585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
660b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
661b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->CharTy.getAsOpaquePtr();
662b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
663b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->ShortTy.getAsOpaquePtr();
664b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
665b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->IntTy.getAsOpaquePtr();
666b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
667b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongTy.getAsOpaquePtr();
668b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
669b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongLongTy.getAsOpaquePtr();
670b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
671b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->Int128Ty.getAsOpaquePtr();
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
674585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
675b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
676b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->FloatTy.getAsOpaquePtr();
677b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
678b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->DoubleTy.getAsOpaquePtr();
679b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
680b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongDoubleTy.getAsOpaquePtr();
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
683585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
691462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
694b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
697b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
698b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
706b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
707b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->VoidPtrTy.getAsOpaquePtr();
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
711b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
712b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->BoolTy.getAsOpaquePtr();
713b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
714b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
715b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
716b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
717b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
718b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
721e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        case DW_ATE_lo_user:
722e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            // This has been seen to mean DW_AT_complex_integer
7239353338e34d711856c80754721fe425bc765c6f3Greg Clayton            if (::strstr(type_name, "complex"))
724e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
725e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
726b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
727e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
728e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            break;
729e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
731b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
732b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatComplexTy.getAsOpaquePtr();
733b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
734b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleComplexTy.getAsOpaquePtr();
735b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
736b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleComplexTy.getAsOpaquePtr();
737e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else
738e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
739e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
740b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
741e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
745b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
746b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatTy.getAsOpaquePtr();
747b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
748b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleTy.getAsOpaquePtr();
749b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
750b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleTy.getAsOpaquePtr();
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
758b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
759b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongLongTy.getAsOpaquePtr();
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7618ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
763b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
764b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongTy.getAsOpaquePtr();
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7668ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
768b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
769b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->ShortTy.getAsOpaquePtr();
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7718ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
773b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
774b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->CharTy.getAsOpaquePtr();
775b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
776b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7788ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
7798ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
780b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
781b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->IntTy.getAsOpaquePtr();
782b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
783b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->Int128Ty.getAsOpaquePtr();
7848ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
7858ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (streq(type_name, "wchar_t"))
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
787b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
788b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->WCharTy.getAsOpaquePtr();
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7907bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                else if (streq(type_name, "void"))
7917bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                {
7927bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
7937bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                        return ast->VoidTy.getAsOpaquePtr();
7947bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                }
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
797b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
798b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
799b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
800b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ShortTy.getAsOpaquePtr();
801b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
802b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->IntTy.getAsOpaquePtr();
803b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
804b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongTy.getAsOpaquePtr();
805b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
806b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongLongTy.getAsOpaquePtr();
807b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
808b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->Int128Ty.getAsOpaquePtr();
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
816b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
817b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
820b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
821b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
822b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
823b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->SignedCharTy.getAsOpaquePtr();
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
831b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
832b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongLongTy.getAsOpaquePtr();
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
836b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
837b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongTy.getAsOpaquePtr();
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8398ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
841b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
842b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedShortTy.getAsOpaquePtr();
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8448ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
846b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
847b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedCharTy.getAsOpaquePtr();
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8498ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
8508ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
851b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
852b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedIntTy.getAsOpaquePtr();
853b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
854b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedInt128Ty.getAsOpaquePtr();
8558ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
858b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
859b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
860b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
861b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
862b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
863b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
864b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
865b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongTy.getAsOpaquePtr();
866b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
867b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongLongTy.getAsOpaquePtr();
868b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
869b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedInt128Ty.getAsOpaquePtr();
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
873b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
874b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
8757bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
8767bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
8855a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    if (type_name)
8865a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    {
8875a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton        fprintf (stderr, "error: need to add support for DW_TAG_base_type '%s' encoded with DW_ATE = 0x%x, bit_size = %u\n", type_name, dw_ate, bit_size);
8885a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    }
8895a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    else
8905a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    {
8915a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton        fprintf (stderr, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size);
8925a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    }
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
896462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
897b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast)
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
899b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->VoidTy.getAsOpaquePtr();
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
902462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
903a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool()
904a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{
905a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan    return getASTContext()->BoolTy.getAsOpaquePtr();
906a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan}
907a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
908a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t
909960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
910960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
911c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
914462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
916960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
91704325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
918960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
919960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
920462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
921960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
922960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
923c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
924960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
925960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
926462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return ast->UnknownAnyTy.getAsOpaquePtr();
930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
931fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
932fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananclang_type_t
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
943462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
949462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
950b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
952b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType void_ptr_type(ast->VoidPtrTy);
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
960462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
96122defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast,
96222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
963462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
96622defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
96722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
968ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
969ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
970cf18faaf72090a68480145ca206955d792633559Sean Callanan
97122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType src (QualType::getFromOpaquePtr(clang_type));
97222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType dst (importer.Import(src));
973cf18faaf72090a68480145ca206955d792633559Sean Callanan
974cf18faaf72090a68480145ca206955d792633559Sean Callanan    return dst.getAsOpaquePtr();
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9786916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
97922defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast,
98022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
9816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
982887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
9838a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
98422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
98522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
986ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
987ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
9886916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
9906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
9916916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9928d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
993b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast,
994462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
995462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
9965510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
99704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    return ast->hasSameType (QualType::getFromOpaquePtr(type1),
99804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton                             QualType::getFromOpaquePtr(type2));
9995510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
10005510dddc33260a991284ef81ca343594f23262e8Sean Callanan
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1003462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1004462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1015462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1016462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1027462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1028462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1039b01000fd063629facd45044f137446fb748ee179Greg Clayton
1040b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1041b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl)
1042b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1043b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1044b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1045b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1046b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1047b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1048b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1049b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1050b01000fd063629facd45044f137446fb748ee179Greg Clayton
1051b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1052b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1053b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1054b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1055b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1056b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1057b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1058b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1059b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1060b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1061b01000fd063629facd45044f137446fb748ee179Greg Clayton
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1064462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1065585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1067b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1068b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
106904325065a00f646527db85e9bc751da29ac53b23Sean Callanan
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
1071b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1074585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
10759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1076306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
10779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
10789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
10799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
10809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
1086b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
1090279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                SourceLocation(),
1091b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                name && name[0] ? &ast->Idents.get(name) : NULL);
1092b01000fd063629facd45044f137446fb748ee179Greg Clayton
1093b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTagDeclType(decl).getAsOpaquePtr();
1094b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1095b01000fd063629facd45044f137446fb748ee179Greg Clayton
1096b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
1097b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1098b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1099b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
1100b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
1101b01000fd063629facd45044f137446fb748ee179Greg Clayton
1102b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1103b01000fd063629facd45044f137446fb748ee179Greg Clayton
1104b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1105b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
1106b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1107b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
1108b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1109b01000fd063629facd45044f137446fb748ee179Greg Clayton            CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1110b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (cxx_record_decl)
1111b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1112b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_record_decl->setHasExternalLexicalStorage (has_extern);
11137a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                cxx_record_decl->setHasExternalVisibleStorage (has_extern);
1114b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1115b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1116b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1117b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1118b01000fd063629facd45044f137446fb748ee179Greg Clayton
1119b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
1120b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1121b01000fd063629facd45044f137446fb748ee179Greg Clayton            EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1122b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (enum_decl)
1123b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1124b01000fd063629facd45044f137446fb748ee179Greg Clayton                enum_decl->setHasExternalLexicalStorage (has_extern);
11257a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                enum_decl->setHasExternalVisibleStorage (has_extern);
1126b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1127b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1128b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1129b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1130b01000fd063629facd45044f137446fb748ee179Greg Clayton
1131b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
1132b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
1133b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1134d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
1135b01000fd063629facd45044f137446fb748ee179Greg Clayton            assert (objc_class_type);
1136b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
1137b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1138b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1139b01000fd063629facd45044f137446fb748ee179Greg Clayton
1140b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (class_interface_decl)
1141b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
1142b01000fd063629facd45044f137446fb748ee179Greg Clayton                    class_interface_decl->setHasExternalLexicalStorage (has_extern);
11437a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    class_interface_decl->setHasExternalVisibleStorage (has_extern);
1144b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return true;
1145b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1146b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1147b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1148b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1150b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
1151b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
1152b01000fd063629facd45044f137446fb748ee179Greg Clayton
1153b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
1154b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1155b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1156b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
1164dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1165494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator"
1166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
1167c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1168c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    const char *post_op_name = NULL;
1169c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1170494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    bool no_space = true;
1171c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1172427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
1173494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        return false;
1174494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan
1175427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
1176427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1177494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    if (post_op_name[0] == ' ')
1178c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    {
1179494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        post_op_name++;
1180494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        no_space = false;
1181c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    }
1182c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1183494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX
1184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH
1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
1192c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    default:
1193c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1194c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1195c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        break;
1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
1197c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1198c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
1206c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1207c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1321dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1322dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1323dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1324dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1325dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1326dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1327dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1328dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1329dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1330dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1331dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1332dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1333dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1334dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1335dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1336dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1337dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1338dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1339dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1340dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1341dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1342dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1343dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1344dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1345dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1346dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1347dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1348dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1349dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1350dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1351dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1352dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1353dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1354dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1355dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1356dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1357dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1358dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1359dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1360dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1361dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1362dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1363dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1364dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1365dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1366dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1367dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1368dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1369dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1370dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1371dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1372dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1373dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1374b01000fd063629facd45044f137446fb748ee179Greg Clayton
13758c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonstatic inline bool
13768c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytoncheck_op_param (bool unary, bool binary, uint32_t num_params)
13778c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{
13788c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    // The parameter count doens't include "this"
13798c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    if (num_params == 0)
13808c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        return unary;
13818c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    if (num_params == 1)
13828c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        return binary;
13838c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    return false;
13848c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton}
13858c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton
13868c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonbool
13878c6907c4daa74a8ebc418ec6eed151b68bda6321Greg ClaytonClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
13888c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{
13898c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (Unary, Binary, num_params);
13908c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    switch (op_kind)
13918c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    {
13928c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#include "clang/Basic/OperatorKinds.def"
13938c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        default: break;
13948c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    }
13958c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    return false;
13968c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton}
13978c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton
1398412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
1399795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
1400795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1401b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1402462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1403412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1404462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1405412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
14061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
14071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
140830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
140930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1410412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1411795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
14123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1413974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1414795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1415b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(ast);
1416795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1417b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
1418795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1419795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1420795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
14213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
14221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1423b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
1424795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
14251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1426412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1427795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
14281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
14291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
143030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
14313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
143230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
143490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
143590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
1436d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
143790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
14385325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
143990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
144090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
1441d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
144230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
144390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
144490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
144590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
144690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
144790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
144890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
144990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1450b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast,
145190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1452279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation(),
1453b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                     DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
145490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
14558950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                                     NULL,
145690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
145790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
145890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
1459b01000fd063629facd45044f137446fb748ee179Greg Clayton    else if (decl_name == cxx_record_decl->getDeclName())
146030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
1461b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast,
146230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
1463279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                      SourceLocation(),
1464b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                      DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
146530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
146630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
146730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
146830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
146930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
147030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
147130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
147290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1473dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1474dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1475dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
147690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1477dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1478dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
14798c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // Check the number of operator parameters. Sometimes we have
14808c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // seen bad DWARF that doesn't correctly describe operators and
14818c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // if we try to create a methed and add it to the class, clang
14828c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // will assert and crash, so we need to make sure things are
14838c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // acceptable.
14848c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
14858c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                    return NULL;
1486b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast,
148790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1488279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         SourceLocation(),
1489b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
149090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
149190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1492dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1493dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1494279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         is_inline,
1495279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         SourceLocation());
1496dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1497dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1498dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1499dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1500b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast,
1501dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
1502279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             SourceLocation(),
1503b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                             DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1504dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1505dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1506dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1507279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             is_explicit,
1508279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             SourceLocation());
1509dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
151090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1511dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1512dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
151390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1514b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast,
151590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1516279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation(),
1517dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
151890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
151990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
152090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
152190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
1522279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     is_inline,
1523279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation());
152490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
152530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1526dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1527462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
152847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
15291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
15301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
153147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
15323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
15333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1534a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis    llvm::SmallVector<ParmVarDecl *, 12> params;
15353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
15363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
15373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
15383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
15393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1540a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis        params.push_back (ParmVarDecl::Create (*ast,
1541a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               cxx_method_decl,
1542a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SourceLocation(),
1543a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SourceLocation(),
1544a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               NULL, // anonymous
1545a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               method_function_prototype->getArgType(param_index),
1546a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               NULL,
1547a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SC_None,
1548a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SC_None,
1549a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               NULL));
15503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
15513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1552a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis    cxx_method_decl->setParams (params.data(), num_params);
15533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
15541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
15557a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton
15567a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPolymorphic()             = %i\n", cxx_record_decl->isPolymorphic());
15577a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAggregate()               = %i\n", cxx_record_decl->isAggregate());
15587a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPOD()                     = %i\n", cxx_record_decl->isPOD());
15597a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isEmpty()                   = %i\n", cxx_record_decl->isEmpty());
15607a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAbstract()                = %i\n", cxx_record_decl->isAbstract());
15617a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialConstructor()     = %i\n", cxx_record_decl->hasTrivialConstructor());
15627a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
15637a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyAssignment()  = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
15647a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialDestructor()      = %i\n", cxx_record_decl->hasTrivialDestructor());
1565412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1566795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1567795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1568795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
156984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
157084f8075072eef306234f8109573067647735c111Greg Clayton(
1571b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1572462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
157384f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1574462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
157584f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
157684f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
157784f8075072eef306234f8109573067647735c111Greg Clayton)
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1582b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1584b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1589d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *clang_type = record_qual_type.getTypePtr();
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1601b01000fd063629facd45044f137446fb748ee179Greg Clayton                APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1602b01000fd063629facd45044f137446fb748ee179Greg Clayton                bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1604b01000fd063629facd45044f137446fb748ee179Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast,
160584f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
160684f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
1607279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                  SourceLocation(),
160884f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
160984f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
16109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  NULL,       // TInfo *
161184f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
16129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  false,      // Mutable
16139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  false);     // HasInit
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161584f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
16239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
1624d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
16259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
16269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
1628b01000fd063629facd45044f137446fb748ee179Greg Clayton                ClangASTContext::AddObjCClassIVar (ast,
162960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
16309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
16319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
16329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
16339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
16359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
16369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
1650b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1655b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast == NULL || field == NULL)
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
1664b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1701b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1703b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1705b01000fd063629facd45044f137446fb748ee179Greg Clayton        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1706b01000fd063629facd45044f137446fb748ee179Greg Clayton
1707d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
1708b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (record_type)
170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1710b01000fd063629facd45044f137446fb748ee179Greg Clayton            RecordDecl *record_decl = record_type->getDecl();
1711b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (record_decl)
171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1713b01000fd063629facd45044f137446fb748ee179Greg Clayton                uint32_t field_idx;
1714b01000fd063629facd45044f137446fb748ee179Greg Clayton                RecordDecl::field_iterator field, field_end;
1715b01000fd063629facd45044f137446fb748ee179Greg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1716b01000fd063629facd45044f137446fb748ee179Greg Clayton                     field != field_end;
1717b01000fd063629facd45044f137446fb748ee179Greg Clayton                     ++field, ++field_idx)
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
1719b01000fd063629facd45044f137446fb748ee179Greg Clayton                    // If no accessibility was assigned, assign the correct one
1720b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1721b01000fd063629facd45044f137446fb748ee179Greg Clayton                        field->setAccess ((AccessSpecifier)default_accessibility);
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1731462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
17346e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
17356e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
17366e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
17376e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
1738ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1739ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     SourceLocation());
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1743e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1744e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1745e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1746e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1747e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1748e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1749e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1750e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1751e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1752e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1754462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1758b01000fd063629facd45044f137446fb748ee179Greg Clayton        CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
1759b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (cxx_record_decl)
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1761b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_record_decl->setBases(base_classes, num_base_classes);
1762b01000fd063629facd45044f137446fb748ee179Greg Clayton            return true;
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176784f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
176884f8075072eef306234f8109573067647735c111Greg Clayton
1769462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
177084f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
177184f8075072eef306234f8109573067647735c111Greg Clayton(
177284f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
177384f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
177484f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
177584f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
177684f8075072eef306234f8109573067647735c111Greg Clayton)
177784f8075072eef306234f8109573067647735c111Greg Clayton{
1778b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1779b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
178084f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
178184f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
1782b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
178384f8075072eef306234f8109573067647735c111Greg Clayton
178484f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
178584f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
178684f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
178784f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
178884f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
1789b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
179084f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
179184f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
1792b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         &ast->Idents.get(name),
179384f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
179484f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
179584f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
17969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1797b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
179884f8075072eef306234f8109573067647735c111Greg Clayton}
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180084f8075072eef306234f8109573067647735c111Greg Claytonbool
1801462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
180284f8075072eef306234f8109573067647735c111Greg Clayton{
180384f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
180484f8075072eef306234f8109573067647735c111Greg Clayton    {
180584f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
180684f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
1807d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *class_type = class_qual_type.getTypePtr();
1808d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *super_type = super_qual_type.getTypePtr();
180984f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
181084f8075072eef306234f8109573067647735c111Greg Clayton        {
1811d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
1812d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
181384f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
181484f8075072eef306234f8109573067647735c111Greg Clayton            {
181584f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
181684f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
181784f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
181884f8075072eef306234f8109573067647735c111Greg Clayton                {
181984f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
182084f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
182184f8075072eef306234f8109573067647735c111Greg Clayton                }
182284f8075072eef306234f8109573067647735c111Greg Clayton            }
182384f8075072eef306234f8109573067647735c111Greg Clayton        }
182484f8075072eef306234f8109573067647735c111Greg Clayton    }
182584f8075072eef306234f8109573067647735c111Greg Clayton    return false;
182684f8075072eef306234f8109573067647735c111Greg Clayton}
182784f8075072eef306234f8109573067647735c111Greg Clayton
182884f8075072eef306234f8109573067647735c111Greg Clayton
182984f8075072eef306234f8109573067647735c111Greg Claytonbool
183084f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
183184f8075072eef306234f8109573067647735c111Greg Clayton(
1832b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1833462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
183484f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1835462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
183684f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
183784f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
18381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
183984f8075072eef306234f8109573067647735c111Greg Clayton)
184084f8075072eef306234f8109573067647735c111Greg Clayton{
184184f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
184284f8075072eef306234f8109573067647735c111Greg Clayton        return false;
184384f8075072eef306234f8109573067647735c111Greg Clayton
1844b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
184584f8075072eef306234f8109573067647735c111Greg Clayton
1846b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
184784f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
184884f8075072eef306234f8109573067647735c111Greg Clayton
184984f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
185084f8075072eef306234f8109573067647735c111Greg Clayton
1851d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
185284f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
185384f8075072eef306234f8109573067647735c111Greg Clayton    {
1854d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
185584f8075072eef306234f8109573067647735c111Greg Clayton
185684f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
185784f8075072eef306234f8109573067647735c111Greg Clayton        {
185884f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
185984f8075072eef306234f8109573067647735c111Greg Clayton
186084f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
186184f8075072eef306234f8109573067647735c111Greg Clayton            {
186284f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
186384f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
186484f8075072eef306234f8109573067647735c111Greg Clayton                {
1865b01000fd063629facd45044f137446fb748ee179Greg Clayton                    APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1866b01000fd063629facd45044f137446fb748ee179Greg Clayton                    bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
186784f8075072eef306234f8109573067647735c111Greg Clayton                }
186884f8075072eef306234f8109573067647735c111Greg Clayton
1869b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
18709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
18719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
1872279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                            SourceLocation(),
18739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
18749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
18759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
18769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
18779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
18781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
18799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
18829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
18839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
18849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
188584f8075072eef306234f8109573067647735c111Greg Clayton            }
188684f8075072eef306234f8109573067647735c111Greg Clayton        }
188784f8075072eef306234f8109573067647735c111Greg Clayton    }
188884f8075072eef306234f8109573067647735c111Greg Clayton    return false;
188984f8075072eef306234f8109573067647735c111Greg Clayton}
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18929488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1893462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
18949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
18959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
18969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1897d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
18989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1900d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
19099488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
19129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
19139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
19149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
19159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
19179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
19189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
19199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
19209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
19219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
19229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
19231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1924462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
19261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1927b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1928462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1930462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
19311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
19331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1937b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1939b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1944d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1948d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
19561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
19591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
19601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
19631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
19641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
19661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1967ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
19681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1969ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1970ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1971ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1972ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
19731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1974ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
19751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1976ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
19776bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        bool has_arg = (start[len] == ':');
19786bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
1979ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
19801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
19816bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
19826bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton            len += 1;
19831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
19841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
19871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
19881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1989b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
19901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
19911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
19931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
1995d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *method_type(method_qual_type.getTypePtr());
19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
19981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2000d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
20011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
20031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
20041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
20071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
20081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
20091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
20101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
20121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2013b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
20141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
20151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
20161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
20171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
20181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
20191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
20201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
20211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
20221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
20231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
20241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
20251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
20261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
20291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
20301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
20321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
20331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
20341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
20361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
2037b01000fd063629facd45044f137446fb748ee179Greg Clayton            params.push_back (ParmVarDecl::Create (*ast,
20381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
20391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
2040279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                   SourceLocation(),
20411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
20421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
20431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
20441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
20451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
20461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
20471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
20481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2049b01000fd063629facd45044f137446fb748ee179Greg Clayton        objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
20501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
20519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
20531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
20561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
20571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2059bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t
2060f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo
2061f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton(
2062f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type,
2063b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::ASTContext *ast,
2064f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t *pointee_or_element_clang_type
2065f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton)
2066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
2067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type == NULL)
2068f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return 0;
2069f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2070f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type)
2071f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        *pointee_or_element_clang_type = NULL;
2072bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2073bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2075bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    switch (type_class)
2077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
207804325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
207904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
208004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
208104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
208204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
2083b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (ast && pointee_or_element_clang_type)
2084b01000fd063629facd45044f137446fb748ee179Greg Clayton                *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
208504325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
20861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
20871a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Bool:
20881a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Char_U:
20891a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::UChar:
20901a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::WChar_U:
20911a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Char16:
20921a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Char32:
20931a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::UShort:
20941a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::UInt:
20951a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::ULong:
20961a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::ULongLong:
20971a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::UInt128:
20981a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Char_S:
20991a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::SChar:
21001a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::WChar_S:
21011a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Short:
21021a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Int:
21031a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Long:
21041a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::LongLong:
21051a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Int128:
21061a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Float:
21071a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::Double:
21081a102087f54079c25c8827afac6153a44ca535daEnrico Granata        case clang::BuiltinType::LongDouble:
21091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
2110f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        default:
2111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
211204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
211304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return eTypeIsBuiltIn | eTypeHasValue;
2114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2115f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::BlockPointer:
2116f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2117f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2118f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2119f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2120e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                          return eTypeIsBuiltIn | eTypeHasValue;
2121f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2122f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ConstantArray:
2123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::DependentSizedArray:
2124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::IncompleteArray:
2125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::VariableArray:
2126f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2127f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2128f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsArray;
2129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2130bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentName:                    return 0;
2131bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
2132bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
2133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Decltype:                         return 0;
2134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Enum:
2136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2137f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsEnumeration | eTypeHasValue;
2139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2140bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Elaborated:                       return 0;
2141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
2142bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
2143bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
2144bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::InjectedClassName:                return 0;
2145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2149f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2152bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
2153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ObjCObjectPointer:
2155f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2157f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2159bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2160bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2162f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Pointer:
2163f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2164f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2165f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2166f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2167bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Record:
2168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (qual_type->getAsCXXRecordDecl())
2169bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2170bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        else
2171bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsStructUnion;
2172bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        break;
2173bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
2174bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
2175bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
2176f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2177f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Typedef:
21789e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2179b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                  ast,
2180f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  pointee_or_element_clang_type);
2181f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2182bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOfExpr:                       return 0;
2183bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOf:                           return 0;
2184bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::UnresolvedUsing:                  return 0;
2185bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
2186bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    default:                                            return 0;
2187bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
2188bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return 0;
2189bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
2190bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2195462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
220303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
22061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
22071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
22081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
22091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
22101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
22119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
22169e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
2226b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2228b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
2232b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
22339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
22349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2236960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
2237960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
2238960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2239f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::BuiltinType::ObjCId:    // child is Class
2240960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
2241960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
2242f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2243960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2244960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
2245960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2246960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2247960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
2248c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2249e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex: return 0;
2250c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
22511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
22527a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
22949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
22957a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
22969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
2297d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
22989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
22999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
23009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
23019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
23029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
23049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
23059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
23079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
23089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
23099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
23109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
23119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
23129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
23139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
23149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
23169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
2325960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2326d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
2327960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
2328b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2329b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2330960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
2331960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
2332960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
2333960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
2334960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
2335960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
2336960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2337960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2345d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2346c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            QualType pointee_type (pointer_type->getPointeeType());
2347b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2348b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
23499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
2351c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2352c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We have a pointer to a pointee type that claims it has no children.
2353c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We will want to look at
2354c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2355c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2361f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2362f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2363f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
2364d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2365f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
2366b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2367b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2368f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                             omit_empty_base_classes);
2369f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            // If this type points to a simple type, then it has 1 child
2370f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (num_pointee_children == 0)
2371f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = 1;
2372f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
2373f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = num_pointee_children;
2374f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
2375f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
2376f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2377f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
23781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
2379b01000fd063629facd45044f137446fb748ee179Greg Clayton        num_children = ClangASTContext::GetNumChildren (ast,
2380b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2381b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        omit_empty_base_classes);
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2390c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no
2391c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a
2392c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer,
2393c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type
2394c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show.
2395c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t
2396c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2397c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{
2398c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (clang_type == NULL)
2399c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        return 0;
2400c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2401c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2402c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2403c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    switch (type_class)
2404c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
24059db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    case clang::Type::Builtin:
24069db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
24079db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        {
2408abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        case clang::BuiltinType::UnknownAny:
24099db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Void:
24109db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::NullPtr:
24119db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 0;
24129db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Bool:
24139db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_U:
24149db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UChar:
2415ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_U:
24169db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char16:
24179db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char32:
24189db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UShort:
24199db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt:
24209db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULong:
24219db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULongLong:
24229db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt128:
24239db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_S:
24249db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::SChar:
2425ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_S:
24269db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Short:
24279db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int:
24289db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Long:
24299db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongLong:
24309db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int128:
24319db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Float:
24329db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Double:
24339db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongDouble:
24349db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Dependent:
24359db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Overload:
24369db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCId:
24379db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCClass:
24389db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCSel:
24390de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan        case clang::BuiltinType::BoundMember:
24409db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 1;
24419db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        }
24429db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        break;
24439db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
2444e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                  return 1;
2445c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Pointer:                  return 1;
2446c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
2447c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::LValueReference:          return 1;
2448c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::RValueReference:          return 1;
2449c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::MemberPointer:            return 0;
2450c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ConstantArray:            return 0;
2451c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::IncompleteArray:          return 0;
2452c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::VariableArray:            return 0;
2453c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedArray:      return 0;
2454c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedExtVector:  return 0;
2455c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Vector:                   return 0;
2456c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ExtVector:                return 0;
2457c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
2458c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
2459c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::UnresolvedUsing:          return 0;
2460c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Paren:                    return 0;
2461c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2462c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOfExpr:               return 0;
2463c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOf:                   return 0;
2464c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Decltype:                 return 0;
2465c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Record:                   return 0;
2466c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Enum:                     return 1;
2467c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Elaborated:               return 1;
2468c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateTypeParm:         return 1;
2469c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::SubstTemplateTypeParm:    return 1;
2470c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateSpecialization:   return 1;
2471c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::InjectedClassName:        return 0;
2472c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentName:            return 1;
2473c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return 1;
2474c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObject:               return 0;
2475c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCInterface:            return 0;
2476c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObjectPointer:        return 1;
2477c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    default:
2478c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        break;
2479c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2480c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    return 0;
2481c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton}
248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2483462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
248658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham    ExecutionContext *exe_ctx,
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2488462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
249224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    bool ignore_array_bounds,
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2497bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
249800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
249900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        return GetChildClangTypeAtIndex (exe_ctx,
250558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                         getASTContext(),
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
251124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                         ignore_array_bounds,
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
2516bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_bitfield_bit_offset,
251700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_base_class,
251800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_deref_of_parent);
251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2522462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
252558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham    ExecutionContext *exe_ctx,
2526b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2528462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
253224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    bool ignore_array_bounds,
253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2537bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
253800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
253900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2545b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
2550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        child_is_base_class = false;
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
255203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
255303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2555960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
2556960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2557960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
2558960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
2559960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
256004325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_name = "isa";
2561b01000fd063629facd45044f137446fb748ee179Greg Clayton                child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
2562b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
2563960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2564960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
2565960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
2566960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
2567960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2568960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
25691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
25707a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
2575b01000fd063629facd45044f137446fb748ee179Greg Clayton                const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
2604a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
2606a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
2611b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton
2612b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton                            child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());
261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2614b01000fd063629facd45044f137446fb748ee179Greg Clayton                            uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26169994a0bcfe1790b320f6a9cf51c8d5ac9c4efdbdJim Ingham                            // Base classes bit sizes should be a multiple of 8 bits in size
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
2619bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            child_is_base_class = true;
262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
2640b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
264154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
2648b01000fd063629facd45044f137446fb748ee179Greg Clayton                        if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
26589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
26597a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
26609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2661d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
26629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
26639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
26649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
26659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
26669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
26679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
26699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
26709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2671b01000fd063629facd45044f137446fb748ee179Greg Clayton                        const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
26729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
26739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
26749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
26759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
26769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2677b01000fd063629facd45044f137446fb748ee179Greg Clayton                                if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
26789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
26799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
26809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
2681b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
26829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
26859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2686b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
26879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2689960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
2690bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                        child_is_base_class = true;
26919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
26939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
26949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
26969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
26979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
26989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
26999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
27009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2701960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2702960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
27039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
27059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2718b01000fd063629facd45044f137446fb748ee179Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
272358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
272458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // that doesn't account for the space taken up by unbacked properties, or from
272558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // the changing size of base classes that are newer than this class.
272658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // So if we have a process around that we can ask about this object, do so.
272758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
272858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
272958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    if (exe_ctx && exe_ctx->process)
273058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    {
273158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        ObjCLanguageRuntime *objc_runtime = exe_ctx->process->GetObjCLanguageRuntime();
273258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        if (objc_runtime != NULL)
273358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        {
2734979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                            ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
273558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                            child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
273658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        }
273758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    }
273858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
273958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
274058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    {
274158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
274258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        child_byte_offset = bit_offset / 8;
274358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    }
27449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
27469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
27479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
27489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
27499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
27509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
27519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
27529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
27569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2757d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2758960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2759960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2760960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2761960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
276200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
276300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
276458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                    return GetChildClangTypeAtIndex (exe_ctx,
276558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                     ast,
2766960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2767960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2768960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2769960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2770960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
277124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                     ignore_array_bounds,
2772960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2773960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2774960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2775960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2776bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
277700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
277800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2779960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2780960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2781960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
278200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
2783960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2784960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2785960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2786960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2787960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2788960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2789960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2790960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2791960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2792b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2793960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2794960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2795960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2796960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2797960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2798960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
27999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
28009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
28019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
280724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                if (ignore_array_bounds || idx < element_count)
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2809b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (GetCompleteQualType (ast, array->getElementType()))
2810b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
2811b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2813b01000fd063629facd45044f137446fb748ee179Greg Clayton                        char element_name[64];
2814b01000fd063629facd45044f137446fb748ee179Greg Clayton                        ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2816b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_name.assign(element_name);
2817b01000fd063629facd45044f137446fb748ee179Greg Clayton                        assert(field_type_info.first % 8 == 0);
2818b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_size = field_type_info.first / 8;
281924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
2820b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return array->getElementType().getAsOpaquePtr();
2821b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
2828d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
28309db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
28319db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                // Don't dereference "void *" pointers
28329db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                if (pointee_type->isVoidType())
28339db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                    return NULL;
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
283700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
283800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
283958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                    return GetChildClangTypeAtIndex (exe_ctx,
284058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                     ast,
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
284624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                     ignore_array_bounds,
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
2851bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
285200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
285300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
285700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
285800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
2868b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2878f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::LValueReference:
2879f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::RValueReference:
2880f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            {
2881d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
2882f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                QualType pointee_type(reference_type->getPointeeType());
2883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2884f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2885f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
288600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
288700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
288858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                    return GetChildClangTypeAtIndex (exe_ctx,
288958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                     ast,
2890f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     parent_name,
2891f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     pointee_clang_type,
2892f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     idx,
2893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     transparent_pointers,
2894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     omit_empty_base_classes,
289524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                     ignore_array_bounds,
2896f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_name,
2897f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_size,
2898f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_offset,
2899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_size,
2900f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_offset,
290100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
290200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2903f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                else
2905f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2906f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (parent_name)
2907f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2908f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name.assign(1, '&');
2909f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name += parent_name;
2910f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2911f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2912f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer to an simple type
2913f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (idx == 0)
2914f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2915b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2916f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        assert(clang_type_info.first % 8 == 0);
2917f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_size = clang_type_info.first / 8;
2918f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_offset = 0;
2919f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        return pointee_type.getAsOpaquePtr();
2920f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2921f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2922f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            }
2923f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2924f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
29251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
292658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham            return GetChildClangTypeAtIndex (exe_ctx,
292758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                             ast,
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
29299e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                             cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
293324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                             ignore_array_bounds,
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
2938bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_bitfield_bit_offset,
293900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_base_class,
294000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_deref_of_parent);
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2947f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2953b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 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)
312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3127b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3128462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
313703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
313803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
31417a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
31749b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                    IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
32299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
32307a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
32319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
32329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
3233d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
32349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
32359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
32369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
32379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
32389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
32399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
32419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
32429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
32439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
32449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3245823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
32469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
32479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
32489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
32509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
32519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
32529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
32539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
32549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
32569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
32579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
32589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
32599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
32619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
32629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
32639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
32649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
32659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
32669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3267b01000fd063629facd45044f137446fb748ee179Greg Clayton                            if (GetIndexOfChildMemberWithName (ast,
3268b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                               ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
32699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
32709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
32719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
32729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
32739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
32749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
32759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
32769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
32779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
32799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
32809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
32819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
32829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
32839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
32849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
32859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
32869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
32879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
32899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3290b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildMemberWithName (ast,
32919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
32929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
32939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
32949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
32959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
32969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
32979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3306b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3327b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
33341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
33351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3337d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3342b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3353d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3358b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3375b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3386b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildMemberWithName (ast,
33879e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                                  cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3407b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3408462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
34169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
341703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
34189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
341903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
34227a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3444b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton                        std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType()));
3445b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton                        if (base_class_type_name.compare (name) == 0)
344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
34669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
34677a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
34689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
34699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
3470d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
34719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
34729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
34739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
34749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
34759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
34769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
34789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
34799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
34809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
34819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
34839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
34849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
34859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
34879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
34889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
34899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
34909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
34919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
34939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
34949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
34959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
34979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
34989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
34999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
35009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
35019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
35029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
35039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
35049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
35059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
35069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
35079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3508b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildWithName (ast,
35099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
35109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
35119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
35129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
35139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
35149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
35151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3522b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3543b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
35501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
35511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3553d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3558b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
355924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3568d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3573b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3589b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3600b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildWithName (ast,
36019e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3615462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
3620d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *clang_type = tag_qual_type.getTypePtr();
362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3623d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const TagType *tag_type = dyn_cast<TagType>(clang_type);
362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
3642462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
364803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
364903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    case clang::Type::UnaryTransform:           break;
36529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
36539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
36549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
36559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
36569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
3657279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentSizedArray:      break;
36589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
3659279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentSizedExtVector:  break;
36609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
36619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
36629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
36639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
36649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
36659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
36669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
36679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
36689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
36699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
36709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
36719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
36729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
36739e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
36749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
36759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
36769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
36779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
36789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
36799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
3680279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentTemplateSpecialization:  break;
3681279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::TemplateTypeParm:         break;
3682279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::SubstTemplateTypeParm:    break;
3683279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::SubstTemplateTypeParmPack:break;
3684279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::PackExpansion:            break;
3685279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::UnresolvedUsing:          break;
3686279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Paren:                    break;
3687279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Elaborated:               break;
3688279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Attributed:               break;
3689279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Auto:                     break;
3690279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::InjectedClassName:        break;
3691279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentName:            break;
369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
369424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
369524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
369624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
369824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
369924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
370124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3706b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
3708b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
3709279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name));
371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
3718462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3722b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3723b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3727b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3728b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
372924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3730279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                        SourceLocation(),
3731b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        DeclarationName (&ast->Idents.get(name)),
373224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
373424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
373524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
373624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3740b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3741b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3743279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                        SourceLocation(),
374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
374624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
374924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
375024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
375124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
375224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
375324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3755462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3756b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast,
3757462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
3758462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
37592ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
37602ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
37612ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
376224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3763b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
376424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
376524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
3769ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    FunctionProtoType::ExtProtoInfo proto_info;
3770ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Variadic = is_variadic;
3771279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    proto_info.ExceptionSpecType = EST_None;
3772ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.TypeQuals = type_quals;
3773279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    proto_info.RefQualifier = RQ_None;
3774ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.NumExceptions = 0;
3775ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Exceptions = NULL;
3776ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan
3777b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
377853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
3780ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                        proto_info).getAsOpaquePtr();    // NoReturn);
378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
378324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3784462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3786b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3787b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
3788b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ParmVarDecl::Create(*ast,
3789b01000fd063629facd45044f137446fb748ee179Greg Clayton                                ast->getTranslationUnitDecl(),
379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
3791279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                SourceLocation(),
3792b01000fd063629facd45044f137446fb748ee179Greg Clayton                                name && name[0] ? &ast->Idents.get(name) : NULL,
37932ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3810462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3811462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3815b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3816b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
3818b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
382624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
382724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3830462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3835d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *t = qual_type.getTypePtr();
383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
383724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3838d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const TagType *tag_type = dyn_cast<TagType>(t);
383924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
384024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
384224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3854462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
385824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
385955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
386055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
386155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
386255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
386455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
386555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
386655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
386755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
386855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3869d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
387004325065a00f646527db85e9bc751da29ac53b23Sean Callanan
387104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        if (objc_class_type)
387204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
387304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
387404325065a00f646527db85e9bc751da29ac53b23Sean Callanan
387504325065a00f646527db85e9bc751da29ac53b23Sean Callanan            class_interface_decl->setForwardDecl(false);
387604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
387704325065a00f646527db85e9bc751da29ac53b23Sean Callanan
387855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
387955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
388055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
388155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
388255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
388355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
388455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
388655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
388755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
388855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
388955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
389055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3891b01000fd063629facd45044f137446fb748ee179Greg Clayton                ASTContext *ast = getASTContext();
389248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
389348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                QualType promotion_qual_type;
389448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // If the enum integer type is less than an integer in bit width,
389548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // then we must promote it to an integer size.
3896b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
389748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                {
389848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
3899b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->IntTy;
390048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    else
3901b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->UnsignedIntTy;
390248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                }
390348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                else
390448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
390548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
390648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
390755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3917462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
39180d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType
39190d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton(
39200d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const char *name,
39210d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    DeclContext *decl_ctx,
39220d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const Declaration &decl,
39230d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    clang_type_t integer_qual_type
39240d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton)
392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
392624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
392724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
3928b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3929b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
393048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
393148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    // TODO: ask about these...
393248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsScoped = false;
393348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsFixed = false;
393448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
3935b01000fd063629facd45044f137446fb748ee179Greg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast,
39360d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                                            decl_ctx,
393748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
393848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
3939279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                            name && name[0] ? &ast->Idents.get(name) : NULL,
39409e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            NULL,
39419e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScoped
39429e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScopedUsingClassTag
39439e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false); // IsFixed
3944864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3945864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3947e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3948e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3949e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
3950864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3951864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
3952864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3953b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
3954e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3958462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3959462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3960462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3961462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3962462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3963d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *clang_type = enum_qual_type.getTypePtr();
3964462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3965462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3966462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3967462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3968462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3969462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3970462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3971462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3972462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3973462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3974462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3975462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3979462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3980462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
398724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
3991b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
399224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3994b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
399524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
399724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3998d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *clang_type = enum_qual_type.getTypePtr();
399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
400324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
400724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
4008b01000fd063629facd45044f137446fb748ee179Greg Clayton                    EnumConstantDecl::Create (*ast,
4009b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_type->getDecl(),
4010b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              SourceLocation(),
4011b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              name ? &identifier_table->get(name) : NULL,    // Identifier
4012b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              QualType::getFromOpaquePtr(enumerator_clang_type),
4013b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              NULL,
4014b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_llvm_apsint);
4015b01000fd063629facd45044f137446fb748ee179Greg Clayton
401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
402024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
402424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
402624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
402824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4029462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4030462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4032427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return CreatePointerType (getASTContext(), clang_type);
4033427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
4034427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
4035427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t
4036427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
4037427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
4038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (ast && clang_type)
40397b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
40407b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
40417b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
404203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
404303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
40447b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
40457b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
40467b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
4047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
40487b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
40497b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
4050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getPointerType(qual_type).getAsOpaquePtr();
40517b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
40527b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
405324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4056462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
40576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
40586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
406024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
40616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
406224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
406324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
406424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4065462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
40666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
40676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
40706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4074462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4075462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
4076fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
4077fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
4078fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
4079fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
4080fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
4081fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
4082fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
4083bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t
408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4086b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
4087b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTypeSize(ast->VoidPtrTy);
408824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4091917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
4092917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
4093917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    QualType pointee_qual_type;
4094917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (clang_type)
4095917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    {
4096917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4097917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4098917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        bool success = false;
4099917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        switch (type_class)
4100917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
4101917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::Builtin:
4102917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
4103917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                {
4104917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    if (dynamic_pointee_type)
4105917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        *dynamic_pointee_type = clang_type;
4106917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    return true;
4107917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                }
4108917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4109917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4110917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::ObjCObjectPointer:
4111917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                if (dynamic_pointee_type)
4112917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4113917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                return true;
4114917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4115917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::Pointer:
4116917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
4117917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                success = true;
4118917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4119917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4120917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::LValueReference:
4121917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::RValueReference:
4122917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
4123917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                success = true;
4124917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4125917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4126917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::Typedef:
412719c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                return ClangASTContext::IsPossibleDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
4128917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4129917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            default:
4130917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4131917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
4132917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4133917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (success)
4134917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
4135917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // Check to make sure what we are pointing too is a possible dynamic C++ type
4136917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // We currently accept any "void *" (in case we have a class that has been
4137917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // watered down to an opaque pointer) and virtual C++ classes.
4138917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
4139917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            switch (pointee_type_class)
4140917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
4141917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::Builtin:
4142917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
4143917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    {
4144917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UnknownAny:
4145917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Void:
4146917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (dynamic_pointee_type)
4147917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4148917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            return true;
4149917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4150917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::NullPtr:
4151917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Bool:
4152917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char_U:
4153917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UChar:
4154917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::WChar_U:
4155917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char16:
4156917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char32:
4157917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UShort:
4158917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UInt:
4159917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ULong:
4160917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ULongLong:
4161917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UInt128:
4162917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char_S:
4163917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::SChar:
4164917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::WChar_S:
4165917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Short:
4166917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Int:
4167917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Long:
4168917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::LongLong:
4169917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Int128:
4170917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Float:
4171917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Double:
4172917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::LongDouble:
4173917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Dependent:
4174917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Overload:
4175917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ObjCId:
4176917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ObjCClass:
4177917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ObjCSel:
4178917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::BoundMember:
4179917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            break;
4180917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    }
4181917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4182917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4183917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::Record:
4184917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    {
4185917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
4186917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        if (cxx_record_decl)
4187917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        {
4188917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (GetCompleteQualType (ast, pointee_qual_type))
4189917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            {
4190917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                success = cxx_record_decl->isDynamicClass();
4191917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            }
4192917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            else
4193917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            {
4194917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                // We failed to get the complete type, so we have to
4195917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                // treat this as a void * which we might possibly be
4196917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                // able to complete
4197917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                success = true;
4198917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            }
4199917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (success)
4200917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            {
4201917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                if (dynamic_pointee_type)
4202917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                    *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4203917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                return true;
4204917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            }
4205917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        }
4206917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    }
4207917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4208917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4209917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::ObjCObject:
4210917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::ObjCInterface:
4211917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    {
4212917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType();
4213917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        if (objc_class_type)
4214917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        {
4215917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            GetCompleteQualType (ast, pointee_qual_type);
4216917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (dynamic_pointee_type)
4217917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4218917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            return true;
4219917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        }
4220917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    }
4221917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4222917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4223917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                default:
4224917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4225917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
4226917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
4227917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    }
4228917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (dynamic_pointee_type)
4229917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        *dynamic_pointee_type = NULL;
4230917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return false;
4231917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
4232917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4233917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4234917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
423582f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
423682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
423782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    QualType pointee_qual_type;
423882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (clang_type)
423982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    {
424082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
424182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
424282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        bool success = false;
424382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        switch (type_class)
424482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        {
424582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Pointer:
424682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
424782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                success = true;
424882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
424982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
425082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::LValueReference:
425182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::RValueReference:
425282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
425382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                success = true;
425482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
425582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
425682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Typedef:
425782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
425882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
425982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            default:
426082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
426182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
426282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
426382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (success)
426482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        {
426582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            // Check to make sure what we are pointing too is a possible dynamic C++ type
426682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            // We currently accept any "void *" (in case we have a class that has been
426782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            // watered down to an opaque pointer) and virtual C++ classes.
426882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
426982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            switch (pointee_type_class)
427082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            {
427182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Builtin:
427282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
427382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                {
427482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UnknownAny:
427582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Void:
427682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (dynamic_pointee_type)
427782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
427882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        return true;
427982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
428082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::NullPtr:
428182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Bool:
428282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char_U:
428382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UChar:
428482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::WChar_U:
428582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char16:
428682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char32:
428782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UShort:
428882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UInt:
428982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ULong:
429082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ULongLong:
429182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UInt128:
429282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char_S:
429382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::SChar:
429482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::WChar_S:
429582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Short:
429682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Int:
429782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Long:
429882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::LongLong:
429982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Int128:
430082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Float:
430182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Double:
430282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::LongDouble:
430382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Dependent:
430482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Overload:
430582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ObjCId:
430682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ObjCClass:
430782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ObjCSel:
430882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::BoundMember:
430982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        break;
431082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                }
431182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
431282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Record:
431382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                {
431482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
431582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    if (cxx_record_decl)
431682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    {
431782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (GetCompleteQualType (ast, pointee_qual_type))
431882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
43190f5e6f1a01b340d463fbdc692f3af492774a5ec4Greg Clayton                            success = cxx_record_decl->isDynamicClass();
432082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
432182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        else
432282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
432382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            // We failed to get the complete type, so we have to
432482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            // treat this as a void * which we might possibly be
432582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            // able to complete
432682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            success = true;
432782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
432882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (success)
432982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
433082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            if (dynamic_pointee_type)
433182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
433282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            return true;
433382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
433482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    }
433582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                }
433682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
433782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
433882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            default:
433982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
434082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            }
434182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
434282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    }
434382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (dynamic_pointee_type)
434482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        *dynamic_pointee_type = NULL;
434582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return false;
434682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
434782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
434882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
434982f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
4350462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
435124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
435224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
435603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
435703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
435904325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
436004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
436104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
436204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        default:
436304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            break;
436404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
436504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
436604325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return true;
436704325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
436804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return false;
43691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
437424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
437524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
437624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
437824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
438024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
438624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
438824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
439024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
439124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
439224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
43949e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
439524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
439624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
439724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
439824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4402462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
440324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
440624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
440924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
441024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
441124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
441224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
441424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
441524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
441824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
442219c0d58b8d2c168b835477e6a681e971ac32ece5Greg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
442419c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton    if (target_type)
442519c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton        *target_type = NULL;
442619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton
442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
443003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
443103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
443224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
443304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::Type::Builtin:
443404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            switch (cast<clang::BuiltinType>(qual_type)->getKind())
443504325065a00f646527db85e9bc751da29ac53b23Sean Callanan            {
443604325065a00f646527db85e9bc751da29ac53b23Sean Callanan            default:
443704325065a00f646527db85e9bc751da29ac53b23Sean Callanan                break;
443804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCId:
443904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCClass:
444004325065a00f646527db85e9bc751da29ac53b23Sean Callanan                return true;
444104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            }
444204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return false;
44431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
444424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
444524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
444624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
444824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
444924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
445024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
445224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
445324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
445424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
445624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
445724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
445824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
446019c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton            return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
446124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
446224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
446324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
446424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
446524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
446624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
446724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
446824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4469462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
447024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
447124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
447224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
447324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
447424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
447524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
447624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
447724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
447824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
447924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
448024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
448124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
448224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
448324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
448424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
448524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
448624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
448724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
448824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
448924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
449024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
449124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
449224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
449324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
449424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
449524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
449624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
449724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
449824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
449924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
450024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
450124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
450224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
450324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
450424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
450524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
450624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
45089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
45099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
45109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    bool is_signed;
45119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (ClangASTContext::IsIntegerType(clang_type, is_signed))
45129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        return true;
45139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
45149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    uint32_t count;
45159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    bool is_complex;
45169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
45179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
45189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
45199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
45209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
45219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
45229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (!IsPointerType(clang_type))
45239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        return false;
45249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
45259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
45269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
45279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return IsScalarType(pointee_type);
45289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
45299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
45309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
45319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
45329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
45339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (!IsArrayType(clang_type))
45349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        return false;
45359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
45369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
45379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
45389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return IsScalarType(item_type);
45399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
45409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
4541bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool
4543bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
4544bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
4545bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type)
4546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
4547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (cxx_record_decl)
4551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
4552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
4553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return true;
4554bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
4555bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
4556bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    class_name.clear();
4557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return false;
4558bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
4559bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4560bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
45611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4562462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
45631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
45641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
45651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
45661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
45671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
45681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
45691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
45701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
45711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
45721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
45731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4574462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
45751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
45761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
45771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
45781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
45791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
45801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
45811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
45821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
45831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
45841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
45851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
4586f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool
4587f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type)
4588f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4589f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4590f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return QualType::getFromOpaquePtr(clang_type)->isCharType();
4591f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return false;
4592f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
459324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
459424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4595462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
459624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4597f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t pointee_or_element_clang_type = NULL;
4598f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
4599f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4600f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type == NULL)
4601f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return false;
4602f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4603f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
460424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4605f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
4606f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4607f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
460824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4609f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4610f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (type_flags.Test (eTypeIsArray))
461124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4612f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We know the size of the array and it could be a C string
4613f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // since it is an array of characters
4614f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4615f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
461624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
4617f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
461824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4619f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = 0;
4620f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
462124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
462224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
462324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
462424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
462524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
462624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
462724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
462824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4629462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
463003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
463103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
463203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
463303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
463403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
463503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
463603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
463703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
463803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
463903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
464003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
4641279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        default:
4642279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
464303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
46449e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
464503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
464603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
464703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
464803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
4649d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
465003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
465103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
465203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
465303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
465403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
465503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
465603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
465703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
465803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
4659f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t
4660f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type)
4661f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4662f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4663f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
466459e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
466559e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
466659e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        switch (type_class)
466759e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        {
466859e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        case clang::Type::ConstantArray:
466959e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton            {
467059e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton                const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
467159e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton                if (array)
467259e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton                    return array->getSize().getLimitedValue();
467359e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton            }
467459e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton            break;
467559e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
467659e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        case clang::Type::Typedef:
467759e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton            return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
46781a102087f54079c25c8827afac6153a44ca535daEnrico Granata            break;
46791a102087f54079c25c8827afac6153a44ca535daEnrico Granata
46801a102087f54079c25c8827afac6153a44ca535daEnrico Granata        default:
46811a102087f54079c25c8827afac6153a44ca535daEnrico Granata            break;
468259e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        }
4683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
4684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return 0;
4685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
468603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
468703e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
4688462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
468924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
469024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
469124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
469224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
469324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
469424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
469503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
469603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
469724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4698279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    default:
4699279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        break;
470059e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
47011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
470224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
470324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
470424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
4705381f968161e2274c55706ead0baed444a26b5092Greg Clayton            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
470624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
470759e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
47081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
470924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
471024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
471124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
471224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
471324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
471459e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
47151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
471624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
471724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
471824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
471924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
47205aad3f5581aec9ee62277d92b11cba7abf837dbdGreg Clayton        return true;
472159e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
47221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
472324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
472424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
472524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
472624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
472724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
472859e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
472959e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton    case clang::Type::Typedef:
473059e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton        return ClangASTContext::IsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
473159e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton                                             member_type,
473259e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton                                             size);
473324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
473424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
473524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
473624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
473724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
473824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
473924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4740462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4741462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
474224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
474324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
474424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
474524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4746b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
474724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
4748b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
474924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
475024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
4751b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
4752b01000fd063629facd45044f137446fb748ee179Greg Clayton        TypedefDecl *decl = TypedefDecl::Create (*ast,
4753b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 decl_ctx,
4754b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 SourceLocation(),
4755279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                 SourceLocation(),
4756b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 name ? &identifier_table->get(name) : NULL, // Identifier
4757b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 ast->CreateTypeSourceInfo(qual_type));
4758864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
4759864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        decl->setAccess(AS_public); // TODO respect proper access specifier
476024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
476124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
4762b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTypedefType (decl).getAsOpaquePtr();
476324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
476424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
476524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
476624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
476724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
476824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
476924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
477024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
477124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
477224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
477324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
4774b01000fd063629facd45044f137446fb748ee179Greg Clayton//ClangASTContext::ConvertFloatValueToString (ASTContext *ast, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
477524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
477624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
477724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
477824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
477924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
478024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
478124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
478224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
478324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
478424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
478524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
478624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
478724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
478824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
478924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
479024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
479124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
479224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
479324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
479424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
479524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
479624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
479724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
479824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
479924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
480024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
480124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
480224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
480324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
480424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
480524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
480624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
480724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
480824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
4809b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
481024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
481124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
481224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
481324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
481424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
481524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
481624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
481724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
481824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
481924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
482024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
482124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
482224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
4823b01000fd063629facd45044f137446fb748ee179Greg Clayton            APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
482424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4825b01000fd063629facd45044f137446fb748ee179Greg Clayton            const uint64_t bit_size = ast->getTypeSize (qual_type);
482624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
482724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
482824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
482924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
483024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
483124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
483224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
483324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
483424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
483524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
483624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
483724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
483824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
483924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
484024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
484124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
484224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
484324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
484424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
484524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4846a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4847a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
4848462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
4849a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
4850a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
4851a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4852a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4853a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4854a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
4855a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
4856b01000fd063629facd45044f137446fb748ee179Greg Clayton
4857b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4858b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
4859b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4860b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
4861b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
4862b01000fd063629facd45044f137446fb748ee179Greg Clayton
48637a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton    return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
4864b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4865b01000fd063629facd45044f137446fb748ee179Greg Clayton
4866b01000fd063629facd45044f137446fb748ee179Greg Clayton
4867b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4868b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type)
4869b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4870b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
4871b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4872b01000fd063629facd45044f137446fb748ee179Greg Clayton
4873e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Claytonbool
4874e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg ClaytonClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
4875e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                  clang::Decl *decl)
4876e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
4877e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (!decl)
4878e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
4879e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4880e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ExternalASTSource *ast_source = ast->getExternalSource();
4881e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4882e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (!ast_source)
4883e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
4884e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4885e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
4886e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
4887e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (tag_decl->getDefinition())
4888e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return true;
4889e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4890e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!tag_decl->hasExternalLexicalStorage())
4891e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return false;
4892e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4893e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ast_source->CompleteType(tag_decl);
4894e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4895e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return !tag_decl->getTypeForDecl()->isIncompleteType();
4896e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
4897e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
4898e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
4899e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!objc_interface_decl->isForwardDecl())
4900e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return true;
4901e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4902e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!objc_interface_decl->hasExternalLexicalStorage())
4903e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return false;
4904e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4905e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ast_source->CompleteType(objc_interface_decl);
4906e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4907e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return !objc_interface_decl->isForwardDecl();
4908e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
4909e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    else
4910e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
4911e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
4912e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
4913e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
4914e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4915a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Claytonclang::DeclContext *
4916a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg ClaytonClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
4917a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton{
4918a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton    return clang::dyn_cast<clang::DeclContext>(cxx_method_decl);
4919a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton}
4920a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
4921a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Claytonclang::DeclContext *
4922a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg ClaytonClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
4923a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton{
4924a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton    return clang::dyn_cast<clang::DeclContext>(objc_method_decl);
4925a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton}
4926a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
4927