ClangASTContext.cpp revision b302b2f50e079b11a12ebafc29104c198f4f15e4
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...
120b01000fd063629facd45044f137446fb748ee179Greg Clayton                bool is_forward_decl = class_interface_decl->isForwardDecl();
121b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
122b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
12382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    if (ast)
124b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
12582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        ExternalASTSource *external_ast_source = ast->getExternalSource();
12682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (external_ast_source)
12782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
12882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            external_ast_source->CompleteType (class_interface_decl);
12982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            is_forward_decl = class_interface_decl->isForwardDecl();
13082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
131b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
1327a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    return is_forward_decl == false;
133b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1347a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                return true;
135b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
136b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
137b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
138b01000fd063629facd45044f137446fb748ee179Greg Clayton
139b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
140b01000fd063629facd45044f137446fb748ee179Greg Clayton        return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
141b01000fd063629facd45044f137446fb748ee179Greg Clayton
142b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
143b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
144b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
145b01000fd063629facd45044f137446fb748ee179Greg Clayton
146b01000fd063629facd45044f137446fb748ee179Greg Clayton    return true;
147b01000fd063629facd45044f137446fb748ee179Greg Clayton}
148b01000fd063629facd45044f137446fb748ee179Greg Clayton
149b01000fd063629facd45044f137446fb748ee179Greg Clayton
15084f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
151585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access)
15284f8075072eef306234f8109573067647735c111Greg Clayton{
15384f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
15484f8075072eef306234f8109573067647735c111Greg Clayton    {
155585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
156585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
157585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
158585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
159585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
16084f8075072eef306234f8109573067647735c111Greg Clayton    }
16184f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
16284f8075072eef306234f8109573067647735c111Greg Clayton}
16384f8075072eef306234f8109573067647735c111Greg Clayton
16484f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
165585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
16684f8075072eef306234f8109573067647735c111Greg Clayton{
16784f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
16884f8075072eef306234f8109573067647735c111Greg Clayton    {
169585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
170585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return ObjCIvarDecl::None;
171585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return ObjCIvarDecl::Public;
172585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return ObjCIvarDecl::Private;
173585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return ObjCIvarDecl::Protected;
174585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPackage:   return ObjCIvarDecl::Package;
17584f8075072eef306234f8109573067647735c111Greg Clayton    }
17684f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
17784f8075072eef306234f8109573067647735c111Greg Clayton}
17884f8075072eef306234f8109573067647735c111Greg Clayton
17984f8075072eef306234f8109573067647735c111Greg Clayton
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
184e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
192e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
194e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
195e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
196e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
197e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
206e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
207e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
208279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_LLVM_IR:
209b01000fd063629facd45044f137446fb748ee179Greg Clayton                assert (!"Invalid input kind!");
210e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
213279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_CUDA:
214279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                LangStd = LangStandard::lang_cuda;
215279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                break;
216e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
217e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
218e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
219e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
220e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
223e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
224e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
225e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
226e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
2748950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan        Opts.setVisibilityMode(DefaultVisibility);
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
348e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
349b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) :
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
351b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap(),
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
359b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_builtins_ap(),
360b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_tag_decl (NULL),
361b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_objc_decl (NULL),
362b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_baton (NULL)
363b01000fd063629facd45044f137446fb748ee179Greg Clayton
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
382b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
389b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
413395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid
414395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch)
415395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{
416395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    Clear();
417395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    m_target_triple.assign(arch.GetTriple().str());
418395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton}
419395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton
420b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
421b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource ()
422b01000fd063629facd45044f137446fb748ee179Greg Clayton{
423b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
424b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
425b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getExternalSource () != NULL;
426b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
427b01000fd063629facd45044f137446fb748ee179Greg Clayton}
428b01000fd063629facd45044f137446fb748ee179Greg Clayton
429b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
430b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
431b01000fd063629facd45044f137446fb748ee179Greg Clayton{
432b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
433b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
434b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
435b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (ast_source_ap);
436b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
437b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
438b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
439b01000fd063629facd45044f137446fb748ee179Greg Clayton}
440b01000fd063629facd45044f137446fb748ee179Greg Clayton
441b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
442b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource ()
443b01000fd063629facd45044f137446fb748ee179Greg Clayton{
444b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
445b01000fd063629facd45044f137446fb748ee179Greg Clayton
446b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
447b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
448b01000fd063629facd45044f137446fb748ee179Greg Clayton        llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
449b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (empty_ast_source_ap);
450b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
451b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
452b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
453b01000fd063629facd45044f137446fb748ee179Greg Clayton}
454b01000fd063629facd45044f137446fb748ee179Greg Clayton
455b01000fd063629facd45044f137446fb748ee179Greg Clayton
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
460b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get() == NULL)
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
462b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
463b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSourceManager(),
464b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getTargetInfo(),
465b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getIdentifierTable(),
466b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSelectorTable(),
467b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getBuiltinContext(),
468b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       0));
469887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
470b01000fd063629facd45044f137446fb748ee179Greg Clayton        if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
471b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
472b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
473b01000fd063629facd45044f137446fb748ee179Greg Clayton            //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
474b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
475b01000fd063629facd45044f137446fb748ee179Greg Clayton
476b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
478b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast_ap.get();
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
503e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
504e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5178a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
5188a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
5198a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
5208a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
52122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    {
52222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        clang::FileSystemOptions file_system_options;
52322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
52422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    }
5258a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
5268a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
5278a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
5281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
53222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
540eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    {
541eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
542eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
543eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    }
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
547887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient
548887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
549887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic:
550887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    NullDiagnosticClient ()
551887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
552887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
553887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
554887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
555887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
556887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
557887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        if (m_log)
558887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        {
559887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            llvm::SmallVectorImpl<char> diag_str(10);
560887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            info.FormatDiagnostic(diag_str);
561887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            diag_str.push_back('\0');
562887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
563887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        }
564887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
565887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate:
566887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    LogSP m_log;
567887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan};
568887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
569887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient *
570887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient()
571887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
572887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    if (m_diagnostic_client_ap.get() == NULL)
573887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_diagnostic_client_ap.reset(new NullDiagnosticClient);
574887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
575887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    return m_diagnostic_client_ap.get();
576887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}
577887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
603b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
605b01000fd063629facd45044f137446fb748ee179Greg Clayton    uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
611462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
612585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
614b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
616b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
618b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
621462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
622b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
624b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
629585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
630b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
631b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->VoidPtrTy.getAsOpaquePtr();
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
634585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
635b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
636b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedCharTy.getAsOpaquePtr();
637b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
638b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedShortTy.getAsOpaquePtr();
639b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
640b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedIntTy.getAsOpaquePtr();
641b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
642b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongTy.getAsOpaquePtr();
643b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
644b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongLongTy.getAsOpaquePtr();
645b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
646b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedInt128Ty.getAsOpaquePtr();
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
649585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
650b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
651b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->CharTy.getAsOpaquePtr();
652b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
653b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->ShortTy.getAsOpaquePtr();
654b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
655b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->IntTy.getAsOpaquePtr();
656b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
657b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongTy.getAsOpaquePtr();
658b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
659b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongLongTy.getAsOpaquePtr();
660b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
661b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->Int128Ty.getAsOpaquePtr();
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
664585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
665b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
666b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->FloatTy.getAsOpaquePtr();
667b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
668b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->DoubleTy.getAsOpaquePtr();
669b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
670b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongDoubleTy.getAsOpaquePtr();
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
673585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
681462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
684b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
687b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
688b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
696b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
697b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->VoidPtrTy.getAsOpaquePtr();
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
701b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
702b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->BoolTy.getAsOpaquePtr();
703b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
704b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
705b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
706b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
707b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
708b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
711e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        case DW_ATE_lo_user:
712e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            // This has been seen to mean DW_AT_complex_integer
7139353338e34d711856c80754721fe425bc765c6f3Greg Clayton            if (::strstr(type_name, "complex"))
714e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
715e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
716b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
717e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
718e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            break;
719e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
721b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
722b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatComplexTy.getAsOpaquePtr();
723b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
724b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleComplexTy.getAsOpaquePtr();
725b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
726b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleComplexTy.getAsOpaquePtr();
727e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else
728e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
729e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
730b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
731e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
735b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
736b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatTy.getAsOpaquePtr();
737b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
738b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleTy.getAsOpaquePtr();
739b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
740b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleTy.getAsOpaquePtr();
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
748b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
749b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongLongTy.getAsOpaquePtr();
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7518ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
753b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
754b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongTy.getAsOpaquePtr();
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
758b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
759b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->ShortTy.getAsOpaquePtr();
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7618ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
763b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
764b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->CharTy.getAsOpaquePtr();
765b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
766b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7688ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
7698ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
770b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
771b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->IntTy.getAsOpaquePtr();
772b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
773b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->Int128Ty.getAsOpaquePtr();
7748ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
7758ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (streq(type_name, "wchar_t"))
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
777b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
778b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->WCharTy.getAsOpaquePtr();
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7807bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                else if (streq(type_name, "void"))
7817bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                {
7827bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
7837bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                        return ast->VoidTy.getAsOpaquePtr();
7847bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                }
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
787b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
788b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
789b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
790b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ShortTy.getAsOpaquePtr();
791b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
792b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->IntTy.getAsOpaquePtr();
793b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
794b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongTy.getAsOpaquePtr();
795b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
796b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongLongTy.getAsOpaquePtr();
797b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
798b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->Int128Ty.getAsOpaquePtr();
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
806b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
807b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
810b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
811b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
812b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
813b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->SignedCharTy.getAsOpaquePtr();
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8198ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
821b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
822b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongLongTy.getAsOpaquePtr();
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
826b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
827b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongTy.getAsOpaquePtr();
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
831b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
832b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedShortTy.getAsOpaquePtr();
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
836b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
837b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedCharTy.getAsOpaquePtr();
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8398ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
8408ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
841b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
842b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedIntTy.getAsOpaquePtr();
843b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
844b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedInt128Ty.getAsOpaquePtr();
8458ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
848b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
849b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
850b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
851b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
852b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
853b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
854b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
855b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongTy.getAsOpaquePtr();
856b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
857b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongLongTy.getAsOpaquePtr();
858b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
859b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedInt128Ty.getAsOpaquePtr();
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
863b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
864b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
8657bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
8667bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
8755a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    if (type_name)
8765a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    {
8775a570908d7c5c7cfd342e5b100ca596780f5b958Greg 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);
8785a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    }
8795a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    else
8805a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    {
8815a570908d7c5c7cfd342e5b100ca596780f5b958Greg 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);
8825a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    }
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
886462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
887b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast)
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
889b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->VoidTy.getAsOpaquePtr();
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
892462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
893a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool()
894a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{
895a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan    return getASTContext()->BoolTy.getAsOpaquePtr();
896a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan}
897a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
898a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t
899960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
900960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
901c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
902960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
903960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
904462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
905960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
90704325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
909960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
910462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
911960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
913c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
914960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
916462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return ast->UnknownAnyTy.getAsOpaquePtr();
920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananclang_type_t
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
933462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
939462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
940b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
942b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType void_ptr_type(ast->VoidPtrTy);
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
950462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
95122defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast,
95222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
953462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9558a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
95622defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
95722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
958ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
959ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
960cf18faaf72090a68480145ca206955d792633559Sean Callanan
96122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType src (QualType::getFromOpaquePtr(clang_type));
96222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType dst (importer.Import(src));
963cf18faaf72090a68480145ca206955d792633559Sean Callanan
964cf18faaf72090a68480145ca206955d792633559Sean Callanan    return dst.getAsOpaquePtr();
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9676916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9686916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
96922defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast,
97022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
9716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
972887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
9738a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
97422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
97522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
976ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
977ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
9786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9796916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
9806916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
9816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9828d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
983b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast,
984462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
985462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
9865510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
98704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    return ast->hasSameType (QualType::getFromOpaquePtr(type1),
98804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton                             QualType::getFromOpaquePtr(type2));
9895510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
9905510dddc33260a991284ef81ca343594f23262e8Sean Callanan
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
993462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
994462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1005462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1006462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1017462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1018462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1029b01000fd063629facd45044f137446fb748ee179Greg Clayton
1030b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1031b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl)
1032b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1033b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1034b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1035b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1036b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1037b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1038b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1039b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1040b01000fd063629facd45044f137446fb748ee179Greg Clayton
1041b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1042b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1043b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1044b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1045b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1046b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1047b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1048b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1049b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1050b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1051b01000fd063629facd45044f137446fb748ee179Greg Clayton
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1054462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1055585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1057b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1058b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
105904325065a00f646527db85e9bc751da29ac53b23Sean Callanan
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
1061b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1064585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
10659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1066306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
10679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
10689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
10699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
10709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
1076b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
1080279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                SourceLocation(),
1081b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                name && name[0] ? &ast->Idents.get(name) : NULL);
1082b01000fd063629facd45044f137446fb748ee179Greg Clayton
1083b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTagDeclType(decl).getAsOpaquePtr();
1084b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1085b01000fd063629facd45044f137446fb748ee179Greg Clayton
1086b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
1087b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1088b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1089b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
1090b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
1091b01000fd063629facd45044f137446fb748ee179Greg Clayton
1092b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1093b01000fd063629facd45044f137446fb748ee179Greg Clayton
1094b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1095b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
1096b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1097b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
1098b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1099b01000fd063629facd45044f137446fb748ee179Greg Clayton            CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1100b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (cxx_record_decl)
1101b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1102b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_record_decl->setHasExternalLexicalStorage (has_extern);
11037a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                cxx_record_decl->setHasExternalVisibleStorage (has_extern);
1104b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1105b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1106b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1107b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1108b01000fd063629facd45044f137446fb748ee179Greg Clayton
1109b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
1110b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1111b01000fd063629facd45044f137446fb748ee179Greg Clayton            EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1112b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (enum_decl)
1113b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1114b01000fd063629facd45044f137446fb748ee179Greg Clayton                enum_decl->setHasExternalLexicalStorage (has_extern);
11157a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                enum_decl->setHasExternalVisibleStorage (has_extern);
1116b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1117b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1118b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1119b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1120b01000fd063629facd45044f137446fb748ee179Greg Clayton
1121b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
1122b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
1123b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1124d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
1125b01000fd063629facd45044f137446fb748ee179Greg Clayton            assert (objc_class_type);
1126b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
1127b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1128b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1129b01000fd063629facd45044f137446fb748ee179Greg Clayton
1130b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (class_interface_decl)
1131b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
1132b01000fd063629facd45044f137446fb748ee179Greg Clayton                    class_interface_decl->setHasExternalLexicalStorage (has_extern);
11337a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    class_interface_decl->setHasExternalVisibleStorage (has_extern);
1134b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return true;
1135b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1136b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1137b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1138b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1140b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
1141b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
1142b01000fd063629facd45044f137446fb748ee179Greg Clayton
1143b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
1144b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1145b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1146b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1149dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
1151dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
1152dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
1153dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
1154dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1155494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator"
1156427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
1157c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1158c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    const char *post_op_name = NULL;
1159c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1160494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    bool no_space = true;
1161c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1162427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
1163494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        return false;
1164494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan
1165427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
1166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1167494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    if (post_op_name[0] == ' ')
1168c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    {
1169494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        post_op_name++;
1170494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        no_space = false;
1171c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    }
1172c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1173494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX
1174427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH
1175dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
1177dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
1178dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
1179dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1180dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
1181dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
1182c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    default:
1183c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1184c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1185c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        break;
1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
1187c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1188c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
1192dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
1193dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
1196c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1197c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1321dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1322dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1323dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1324dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1325dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1326dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1327dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1328dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1329dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1330dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1331dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1332dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1333dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1334dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1335dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1336dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1337dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1338dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1339dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1340dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1341dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1342dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1343dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1344dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1345dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1346dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1347dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1348dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1349dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1350dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1351dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1352dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1353dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1354dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1355dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1356dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1357dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1358dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1359dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1360dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1361dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1362dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1363dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1364b01000fd063629facd45044f137446fb748ee179Greg Clayton
13658c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonstatic inline bool
13668c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytoncheck_op_param (bool unary, bool binary, uint32_t num_params)
13678c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{
13688c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    // The parameter count doens't include "this"
13698c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    if (num_params == 0)
13708c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        return unary;
13718c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    if (num_params == 1)
13728c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        return binary;
13738c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    return false;
13748c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton}
13758c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton
13768c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonbool
13778c6907c4daa74a8ebc418ec6eed151b68bda6321Greg ClaytonClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
13788c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{
13798c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (Unary, Binary, num_params);
13808c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    switch (op_kind)
13818c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    {
13828c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#include "clang/Basic/OperatorKinds.def"
13838c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        default: break;
13848c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    }
13858c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    return false;
13868c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton}
13878c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton
1388412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
1389795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
1390795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1391b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1392462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1393412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1394462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1395412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
13961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
13971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
139830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
139930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1400412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1401795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
14023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1403974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1404795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1405b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(ast);
1406795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1407b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
1408795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1409795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1410795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
14113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
14121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1413b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
1414795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
14151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1416412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1417795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
14181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
14191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
142030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
14213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
142230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
142390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
142490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
142590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
1426d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
142790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
14285325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
142990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
143090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
1431d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
143230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
143490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
143590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
143690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
143790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
143890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
143990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1440b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast,
144190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1442279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation(),
1443b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                     DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
144490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
14458950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                                     NULL,
144690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
144790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
144890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
1449b01000fd063629facd45044f137446fb748ee179Greg Clayton    else if (decl_name == cxx_record_decl->getDeclName())
145030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
1451b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast,
145230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
1453279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                      SourceLocation(),
1454b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                      DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
145530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
145630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
145730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
145830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
145930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
146030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
146130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
146290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1463dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1464dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1465dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
146690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1467dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1468dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
14698c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // Check the number of operator parameters. Sometimes we have
14708c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // seen bad DWARF that doesn't correctly describe operators and
14718c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // if we try to create a methed and add it to the class, clang
14728c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // will assert and crash, so we need to make sure things are
14738c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                // acceptable.
14748c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
14758c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton                    return NULL;
1476b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast,
147790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1478279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         SourceLocation(),
1479b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
148090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
148190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1482dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1483dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1484279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         is_inline,
1485279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         SourceLocation());
1486dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1487dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1488dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1489dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1490b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast,
1491dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
1492279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             SourceLocation(),
1493b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                             DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1494dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1495dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1496dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1497279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             is_explicit,
1498279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             SourceLocation());
1499dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
150090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1501dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1502dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
150390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1504b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast,
150590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1506279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation(),
1507dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
150890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
150990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
151090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
151190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
1512279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     is_inline,
1513279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation());
151490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
151530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1516dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1517462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
151847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
15191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
15201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
152147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
15223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
15233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1524a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis    llvm::SmallVector<ParmVarDecl *, 12> params;
15253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
15263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
15273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
15283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
15293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1530a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis        params.push_back (ParmVarDecl::Create (*ast,
1531a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               cxx_method_decl,
1532a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SourceLocation(),
1533a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SourceLocation(),
1534a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               NULL, // anonymous
1535a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               method_function_prototype->getArgType(param_index),
1536a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               NULL,
1537a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SC_None,
1538a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               SC_None,
1539a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis                                               NULL));
15403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
15413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1542a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis    cxx_method_decl->setParams (params.data(), num_params);
15433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
15441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
15457a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton
15467a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPolymorphic()             = %i\n", cxx_record_decl->isPolymorphic());
15477a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAggregate()               = %i\n", cxx_record_decl->isAggregate());
15487a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPOD()                     = %i\n", cxx_record_decl->isPOD());
15497a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isEmpty()                   = %i\n", cxx_record_decl->isEmpty());
15507a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAbstract()                = %i\n", cxx_record_decl->isAbstract());
15517a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialConstructor()     = %i\n", cxx_record_decl->hasTrivialConstructor());
15527a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
15537a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyAssignment()  = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
15547a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialDestructor()      = %i\n", cxx_record_decl->hasTrivialDestructor());
1555412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1556795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1557795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1558795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
155984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
156084f8075072eef306234f8109573067647735c111Greg Clayton(
1561b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1562462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
156384f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1564462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
156584f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
156684f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
156784f8075072eef306234f8109573067647735c111Greg Clayton)
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1572b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1574b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1579d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *clang_type = record_qual_type.getTypePtr();
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1591b01000fd063629facd45044f137446fb748ee179Greg Clayton                APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1592b01000fd063629facd45044f137446fb748ee179Greg Clayton                bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1594b01000fd063629facd45044f137446fb748ee179Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast,
159584f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
159684f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
1597279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                  SourceLocation(),
159884f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
159984f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
160084f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
160184f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
160284f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160484f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
16129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
1613d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
16149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
16159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
1617b01000fd063629facd45044f137446fb748ee179Greg Clayton                ClangASTContext::AddObjCClassIVar (ast,
161860a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
16199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
16209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
16219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
16229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
16249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
16259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
1639b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1644b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast == NULL || field == NULL)
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
1653b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1690b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1692b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1694b01000fd063629facd45044f137446fb748ee179Greg Clayton        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1695b01000fd063629facd45044f137446fb748ee179Greg Clayton
1696d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
1697b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (record_type)
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1699b01000fd063629facd45044f137446fb748ee179Greg Clayton            RecordDecl *record_decl = record_type->getDecl();
1700b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (record_decl)
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1702b01000fd063629facd45044f137446fb748ee179Greg Clayton                uint32_t field_idx;
1703b01000fd063629facd45044f137446fb748ee179Greg Clayton                RecordDecl::field_iterator field, field_end;
1704b01000fd063629facd45044f137446fb748ee179Greg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1705b01000fd063629facd45044f137446fb748ee179Greg Clayton                     field != field_end;
1706b01000fd063629facd45044f137446fb748ee179Greg Clayton                     ++field, ++field_idx)
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
1708b01000fd063629facd45044f137446fb748ee179Greg Clayton                    // If no accessibility was assigned, assign the correct one
1709b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1710b01000fd063629facd45044f137446fb748ee179Greg Clayton                        field->setAccess ((AccessSpecifier)default_accessibility);
171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1720462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
17236e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
17246e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
17256e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
17266e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
1727ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1728ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     SourceLocation());
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1732e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1733e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1734e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1735e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1736e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1737e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1738e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1739e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1740e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1741e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1743462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1747b01000fd063629facd45044f137446fb748ee179Greg Clayton        CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
1748b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (cxx_record_decl)
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1750b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_record_decl->setBases(base_classes, num_base_classes);
1751b01000fd063629facd45044f137446fb748ee179Greg Clayton            return true;
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
175684f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
175784f8075072eef306234f8109573067647735c111Greg Clayton
1758462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
175984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
176084f8075072eef306234f8109573067647735c111Greg Clayton(
176184f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
176284f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
176384f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
176484f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
176584f8075072eef306234f8109573067647735c111Greg Clayton)
176684f8075072eef306234f8109573067647735c111Greg Clayton{
1767b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1768b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
176984f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
177084f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
1771b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
177284f8075072eef306234f8109573067647735c111Greg Clayton
177384f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
177484f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
177584f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
177684f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
177784f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
1778b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
177984f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
178084f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
1781b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         &ast->Idents.get(name),
178284f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
178384f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
178484f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
17859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1786b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
178784f8075072eef306234f8109573067647735c111Greg Clayton}
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178984f8075072eef306234f8109573067647735c111Greg Claytonbool
1790462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
179184f8075072eef306234f8109573067647735c111Greg Clayton{
179284f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
179384f8075072eef306234f8109573067647735c111Greg Clayton    {
179484f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
179584f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
1796d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *class_type = class_qual_type.getTypePtr();
1797d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *super_type = super_qual_type.getTypePtr();
179884f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
179984f8075072eef306234f8109573067647735c111Greg Clayton        {
1800d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
1801d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
180284f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
180384f8075072eef306234f8109573067647735c111Greg Clayton            {
180484f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
180584f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
180684f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
180784f8075072eef306234f8109573067647735c111Greg Clayton                {
180884f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
180984f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
181084f8075072eef306234f8109573067647735c111Greg Clayton                }
181184f8075072eef306234f8109573067647735c111Greg Clayton            }
181284f8075072eef306234f8109573067647735c111Greg Clayton        }
181384f8075072eef306234f8109573067647735c111Greg Clayton    }
181484f8075072eef306234f8109573067647735c111Greg Clayton    return false;
181584f8075072eef306234f8109573067647735c111Greg Clayton}
181684f8075072eef306234f8109573067647735c111Greg Clayton
181784f8075072eef306234f8109573067647735c111Greg Clayton
181884f8075072eef306234f8109573067647735c111Greg Claytonbool
181984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
182084f8075072eef306234f8109573067647735c111Greg Clayton(
1821b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1822462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
182384f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1824462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
182584f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
182684f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
18271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
182884f8075072eef306234f8109573067647735c111Greg Clayton)
182984f8075072eef306234f8109573067647735c111Greg Clayton{
183084f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
183184f8075072eef306234f8109573067647735c111Greg Clayton        return false;
183284f8075072eef306234f8109573067647735c111Greg Clayton
1833b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
183484f8075072eef306234f8109573067647735c111Greg Clayton
1835b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
183684f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
183784f8075072eef306234f8109573067647735c111Greg Clayton
183884f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
183984f8075072eef306234f8109573067647735c111Greg Clayton
1840d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
184184f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
184284f8075072eef306234f8109573067647735c111Greg Clayton    {
1843d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
184484f8075072eef306234f8109573067647735c111Greg Clayton
184584f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
184684f8075072eef306234f8109573067647735c111Greg Clayton        {
184784f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
184884f8075072eef306234f8109573067647735c111Greg Clayton
184984f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
185084f8075072eef306234f8109573067647735c111Greg Clayton            {
185184f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
185284f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
185384f8075072eef306234f8109573067647735c111Greg Clayton                {
1854b01000fd063629facd45044f137446fb748ee179Greg Clayton                    APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1855b01000fd063629facd45044f137446fb748ee179Greg Clayton                    bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
185684f8075072eef306234f8109573067647735c111Greg Clayton                }
185784f8075072eef306234f8109573067647735c111Greg Clayton
1858b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
18599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
18609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
1861279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                            SourceLocation(),
18629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
18639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
18659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
18669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
18671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
18689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
18709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
18719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
18729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
18739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
187484f8075072eef306234f8109573067647735c111Greg Clayton            }
187584f8075072eef306234f8109573067647735c111Greg Clayton        }
187684f8075072eef306234f8109573067647735c111Greg Clayton    }
187784f8075072eef306234f8109573067647735c111Greg Clayton    return false;
187884f8075072eef306234f8109573067647735c111Greg Clayton}
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1882462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
18839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
18849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
18859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1886d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
18879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
18889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1889d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
18909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
18929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
18939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
18949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
18959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
18969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18979488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
18989488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
19009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
19099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
19121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1913462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
19141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
19151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1916b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1917462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
19181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1919462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
19201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
19211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
19221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
19231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
19241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1926b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
19271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1928b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
19301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1933d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1937d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
19481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
19531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
19551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1956ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1958ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1959ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1960ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1961ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1963ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
19641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1965ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
19666bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        bool has_arg = (start[len] == ':');
19676bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
1968ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
19691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
19706bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
19716bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton            len += 1;
19721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
19731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
19761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
19771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1978b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
19791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
19801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
19821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
1984d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *method_type(method_qual_type.getTypePtr());
19851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
19871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1989d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
19901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
19921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
19971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
19981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
19991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
20011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2002b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
20031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
20041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
20051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
20061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
20071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
20081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
20091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
20101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
20111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
20121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
20131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
20141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
20151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
20181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
20191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
20211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
20221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
20231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
20251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
2026b01000fd063629facd45044f137446fb748ee179Greg Clayton            params.push_back (ParmVarDecl::Create (*ast,
20271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
20281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
2029279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                   SourceLocation(),
20301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
20311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
20321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
20331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
20341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
20351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
20361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
20371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2038b01000fd063629facd45044f137446fb748ee179Greg Clayton        objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
20391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
20409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
20421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
20451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
20461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2048bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t
2049f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo
2050f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton(
2051f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type,
2052b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::ASTContext *ast,
2053f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t *pointee_or_element_clang_type
2054f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton)
2055bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
2056bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type == NULL)
2057f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return 0;
2058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2059f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type)
2060f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        *pointee_or_element_clang_type = NULL;
2061bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2062bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2064bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2065bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    switch (type_class)
2066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
206704325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
206804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
206904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
207004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
207104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
2072b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (ast && pointee_or_element_clang_type)
2073b01000fd063629facd45044f137446fb748ee179Greg Clayton                *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
207404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
2075f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2076f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        default:
2077f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
207804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
207904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return eTypeIsBuiltIn | eTypeHasValue;
2080f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2081f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::BlockPointer:
2082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2086e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                          return eTypeIsBuiltIn | eTypeHasValue;
2087f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2088f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ConstantArray:
2089f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::DependentSizedArray:
2090f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::IncompleteArray:
2091f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::VariableArray:
2092f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2093f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2094f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsArray;
2095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2096bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentName:                    return 0;
2097bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
2098bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
2099bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Decltype:                         return 0;
2100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2101f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Enum:
2102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2104f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsEnumeration | eTypeHasValue;
2105f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2106bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Elaborated:                       return 0;
2107bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
2108bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
2109bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
2110bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::InjectedClassName:                return 0;
2111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2112f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2113f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2115f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2116f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2117f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2118bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
2119f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2120f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ObjCObjectPointer:
2121f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2122f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2125bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2126bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2127f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2128f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Pointer:
2129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Record:
2134bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (qual_type->getAsCXXRecordDecl())
2135bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2136bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        else
2137bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsStructUnion;
2138bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        break;
2139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
2140bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
2141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
2142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Typedef:
21449e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2145b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                  ast,
2146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  pointee_or_element_clang_type);
2147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2148bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOfExpr:                       return 0;
2149bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOf:                           return 0;
2150bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::UnresolvedUsing:                  return 0;
2151bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
2152bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    default:                                            return 0;
2153bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
2154bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return 0;
2155bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
2156bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
21579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2161462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
216903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
21721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
21731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
21741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
21751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
21761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
21829e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
2192b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2194b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
2198b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2202960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
2203960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
2204960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2205f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::BuiltinType::ObjCId:    // child is Class
2206960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
2207960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
2208f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2209960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2210960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
2211960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2212960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2213960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
2214c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2215e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex: return 0;
2216c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
22171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
22187a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
22609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
22617a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
22629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
2263d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
22649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
22659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
22669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
22679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
22689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
22709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
22719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
22739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
22749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
22759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
22769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
22779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
22789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
22799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
22809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
22819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
22829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
22839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
22859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
22869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
22879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
22889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
22899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
2291960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2292d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
2293960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
2294b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2295b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2296960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
2297960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
2298960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
2299960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
2300960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
2301960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
2302960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2303960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
23049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2311d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2312c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            QualType pointee_type (pointer_type->getPointeeType());
2313b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2314b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
2317c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2318c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We have a pointer to a pointee type that claims it has no children.
2319c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We will want to look at
2320c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2321c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2327f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2328f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2329f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
2330d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2331f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
2332b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2333b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2334f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                             omit_empty_base_classes);
2335f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            // If this type points to a simple type, then it has 1 child
2336f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (num_pointee_children == 0)
2337f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = 1;
2338f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
2339f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = num_pointee_children;
2340f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
2341f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
2342f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2343f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
23441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
2345b01000fd063629facd45044f137446fb748ee179Greg Clayton        num_children = ClangASTContext::GetNumChildren (ast,
2346b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2347b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        omit_empty_base_classes);
234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2356c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no
2357c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a
2358c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer,
2359c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type
2360c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show.
2361c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t
2362c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2363c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{
2364c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (clang_type == NULL)
2365c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        return 0;
2366c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2367c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2368c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2369c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    switch (type_class)
2370c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
23719db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    case clang::Type::Builtin:
23729db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
23739db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        {
2374abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        case clang::BuiltinType::UnknownAny:
23759db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Void:
23769db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::NullPtr:
23779db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 0;
23789db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Bool:
23799db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_U:
23809db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UChar:
2381ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_U:
23829db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char16:
23839db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char32:
23849db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UShort:
23859db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt:
23869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULong:
23879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULongLong:
23889db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt128:
23899db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_S:
23909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::SChar:
2391ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_S:
23929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Short:
23939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int:
23949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Long:
23959db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongLong:
23969db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int128:
23979db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Float:
23989db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Double:
23999db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongDouble:
24009db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Dependent:
24019db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Overload:
24029db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCId:
24039db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCClass:
24049db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCSel:
24050de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan        case clang::BuiltinType::BoundMember:
24069db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 1;
24079db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        }
24089db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        break;
24099db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
2410e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                  return 1;
2411c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Pointer:                  return 1;
2412c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
2413c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::LValueReference:          return 1;
2414c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::RValueReference:          return 1;
2415c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::MemberPointer:            return 0;
2416c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ConstantArray:            return 0;
2417c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::IncompleteArray:          return 0;
2418c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::VariableArray:            return 0;
2419c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedArray:      return 0;
2420c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedExtVector:  return 0;
2421c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Vector:                   return 0;
2422c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ExtVector:                return 0;
2423c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
2424c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
2425c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::UnresolvedUsing:          return 0;
2426c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Paren:                    return 0;
2427c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2428c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOfExpr:               return 0;
2429c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOf:                   return 0;
2430c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Decltype:                 return 0;
2431c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Record:                   return 0;
2432c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Enum:                     return 1;
2433c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Elaborated:               return 1;
2434c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateTypeParm:         return 1;
2435c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::SubstTemplateTypeParm:    return 1;
2436c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateSpecialization:   return 1;
2437c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::InjectedClassName:        return 0;
2438c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentName:            return 1;
2439c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return 1;
2440c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObject:               return 0;
2441c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCInterface:            return 0;
2442c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObjectPointer:        return 1;
2443c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    default:
2444c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        break;
2445c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2446c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    return 0;
2447c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton}
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2449462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
245258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham    ExecutionContext *exe_ctx,
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2454462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2462bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
246300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
246400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        return GetChildClangTypeAtIndex (exe_ctx,
247058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                         getASTContext(),
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
2480bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_bitfield_bit_offset,
248100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_base_class,
248200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_deref_of_parent);
248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2486462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
248958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham    ExecutionContext *exe_ctx,
2490b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2492462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2500bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
250100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
250200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2508b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
2513bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        child_is_base_class = false;
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
251503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
251603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2518960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
2519960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2520960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
2521960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
2522960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
252304325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_name = "isa";
2524b01000fd063629facd45044f137446fb748ee179Greg Clayton                child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
2525b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
2526960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2527960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
2528960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
2529960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
2530960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2531960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
25321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
25337a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
2538b01000fd063629facd45044f137446fb748ee179Greg Clayton                const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
2567a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
2569a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
2574b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton
2575b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton                            child_name = ClangASTType::GetTypeNameForQualType(base_class->getType());
257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2577b01000fd063629facd45044f137446fb748ee179Greg Clayton                            uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25799994a0bcfe1790b320f6a9cf51c8d5ac9c4efdbdJim Ingham                            // Base classes bit sizes should be a multiple of 8 bits in size
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
2582bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            child_is_base_class = true;
258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
2603b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
260454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
2611b01000fd063629facd45044f137446fb748ee179Greg Clayton                        if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
26219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
26227a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
26239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2624d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
26259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
26269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
26279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
26289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
26299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
26309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
26329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
26339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2634b01000fd063629facd45044f137446fb748ee179Greg Clayton                        const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
26359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
26369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
26379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
26389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
26399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2640b01000fd063629facd45044f137446fb748ee179Greg Clayton                                if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
26419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
26429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
26439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
2644b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
26459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
26489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2649b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
26509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2652960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
2653bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                        child_is_base_class = true;
26549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
26569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
26579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
26599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
26609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
26619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
26629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
26639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2664960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2665960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
26669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
26689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
26699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
26709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
26729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
26739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
26749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
26759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
26769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
26789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
26809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2681b01000fd063629facd45044f137446fb748ee179Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
26829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
26849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
268658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
268758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // that doesn't account for the space taken up by unbacked properties, or from
268858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // the changing size of base classes that are newer than this class.
268958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    // So if we have a process around that we can ask about this object, do so.
269058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
269158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
269258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    if (exe_ctx && exe_ctx->process)
269358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    {
269458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        ObjCLanguageRuntime *objc_runtime = exe_ctx->process->GetObjCLanguageRuntime();
269558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        if (objc_runtime != NULL)
269658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        {
269758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                            ClangASTType parent_ast_type (parent_qual_type.getAsOpaquePtr(), ast);
269858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                            child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
269958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        }
270058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    }
270158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
270258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
270358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    {
270458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
270558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                        child_byte_offset = bit_offset / 8;
270658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                    }
27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2720d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2721960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2722960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2723960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2724960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
272500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
272600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
272758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                    return GetChildClangTypeAtIndex (exe_ctx,
272858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                     ast,
2729960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2730960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2731960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2732960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2733960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
2734960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2735960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2736960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2737960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2738bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
273900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
274000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2741960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2742960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2743960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
274400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
2745960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2746960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2747960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2748960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2749960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2750960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2751960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2752960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2753960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2754b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2755960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2756960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2757960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2758960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2759960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2760960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
27619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2771b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (GetCompleteQualType (ast, array->getElementType()))
2772b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
2773b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2775b01000fd063629facd45044f137446fb748ee179Greg Clayton                        char element_name[64];
2776b01000fd063629facd45044f137446fb748ee179Greg Clayton                        ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2778b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_name.assign(element_name);
2779b01000fd063629facd45044f137446fb748ee179Greg Clayton                        assert(field_type_info.first % 8 == 0);
2780b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_size = field_type_info.first / 8;
2781b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_offset = idx * child_byte_size;
2782b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return array->getElementType().getAsOpaquePtr();
2783b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
2790d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
27929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
27939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                // Don't dereference "void *" pointers
27949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                if (pointee_type->isVoidType())
27959db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                    return NULL;
279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
279900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
280000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
280158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                    return GetChildClangTypeAtIndex (exe_ctx,
280258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                     ast,
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
2812bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
281300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
281400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
281800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
281900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
2829b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2839f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::LValueReference:
2840f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::RValueReference:
2841f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            {
2842d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
2843f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                QualType pointee_type(reference_type->getPointeeType());
2844f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2845f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2846f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
284700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
284800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
284958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                    return GetChildClangTypeAtIndex (exe_ctx,
285058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                     ast,
2851f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     parent_name,
2852f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     pointee_clang_type,
2853f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     idx,
2854f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     transparent_pointers,
2855f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     omit_empty_base_classes,
2856f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_name,
2857f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_size,
2858f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_offset,
2859f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_size,
2860f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_offset,
286100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
286200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2863f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2864f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                else
2865f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2866f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (parent_name)
2867f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2868f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name.assign(1, '&');
2869f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name += parent_name;
2870f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2871f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2872f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer to an simple type
2873f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (idx == 0)
2874f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2875b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2876f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        assert(clang_type_info.first % 8 == 0);
2877f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_size = clang_type_info.first / 8;
2878f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_offset = 0;
2879f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        return pointee_type.getAsOpaquePtr();
2880f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2881f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2882f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            }
2883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2884f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
28851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
288658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham            return GetChildClangTypeAtIndex (exe_ctx,
288758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                             ast,
288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
28899e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                             cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
2897bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_bitfield_bit_offset,
289800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_base_class,
289900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_deref_of_parent);
290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2906f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2912b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
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",
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3086b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3087462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
309603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
309703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
31007a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
3133b01000fd063629facd45044f137446fb748ee179Greg Clayton                    IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name));
313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
31889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
31897a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
31909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
31919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
3192d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
31939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
31949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
31959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
31969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
31979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
31989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
32009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
32019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
32029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
32039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3204823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
32059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
32069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
32079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
32099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
32109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
32119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
32129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
32139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
32159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
32169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
32179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
32189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
32209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
32219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
32229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
32239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
32249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
32259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3226b01000fd063629facd45044f137446fb748ee179Greg Clayton                            if (GetIndexOfChildMemberWithName (ast,
3227b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                               ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
32289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
32299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
32309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
32319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
32329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
32339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
32349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
32359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
32369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
32389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
32399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
32409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
32419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
32429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
32439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
32449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
32459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
32469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
32489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3249b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildMemberWithName (ast,
32509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
32519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
32529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
32539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
32549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
32559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
32569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3265b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
327724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3286b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
32931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
32941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3296d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3301b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3312d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3317b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3334b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3345b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildMemberWithName (ast,
33469e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                                  cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3366b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3367462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
33759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
337603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
33779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
337803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
33817a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3403b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton                        std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType()));
3404b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton                        if (base_class_type_name.compare (name) == 0)
340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
34259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
34267a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
34279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
34289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
3429d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
34309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
34319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
34329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
34339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
34349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
34359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
34379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
34389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
34399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
34409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
34429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
34439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
34449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
34469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
34479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
34489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
34499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
34509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
34529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
34539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
34549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
34569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
34579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
34589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
34599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
34609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
34619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
34629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
34639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
34649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
34669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3467b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildWithName (ast,
34689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
34699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
34709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
34719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
34729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
34739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3481b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
349124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
349924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
350124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3502b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
350324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
350524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
350624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
350724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
35091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
35101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3512d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3517b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3527d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3532b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3548b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3559b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildWithName (ast,
35609e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3574462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
3579d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *clang_type = tag_qual_type.getTypePtr();
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3582d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const TagType *tag_type = dyn_cast<TagType>(clang_type);
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
3601462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
360703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
360803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
36119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
36129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
36139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
36149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
3615279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentSizedArray:      break;
36169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
3617279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentSizedExtVector:  break;
36189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
36199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
36209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
36219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
36229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
36239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
36249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
36259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
36269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
36279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
36289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
36299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
36309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
36319e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
36329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
36339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
36349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
36359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
36369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
36379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
3638279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentTemplateSpecialization:  break;
3639279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::TemplateTypeParm:         break;
3640279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::SubstTemplateTypeParm:    break;
3641279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::SubstTemplateTypeParmPack:break;
3642279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::PackExpansion:            break;
3643279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::UnresolvedUsing:          break;
3644279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Paren:                    break;
3645279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Elaborated:               break;
3646279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Attributed:               break;
3647279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Auto:                     break;
3648279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::InjectedClassName:        break;
3649279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentName:            break;
365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3664b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
3666b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
3667279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name));
366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
3676462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3680b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3681b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3685b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3686b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
368724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3688279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                        SourceLocation(),
3689b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        DeclarationName (&ast->Idents.get(name)),
369024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
369424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
369524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
369624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3698b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3699b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3701279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                        SourceLocation(),
370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
370624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3713462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3714b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast,
3715462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
3716462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
37172ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
37182ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
37192ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3721b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
372324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
3727ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    FunctionProtoType::ExtProtoInfo proto_info;
3728ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Variadic = is_variadic;
3729279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    proto_info.ExceptionSpecType = EST_None;
3730ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.TypeQuals = type_quals;
3731279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    proto_info.RefQualifier = RQ_None;
3732ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.NumExceptions = 0;
3733ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Exceptions = NULL;
3734ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan
3735b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
373653d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
3738ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                        proto_info).getAsOpaquePtr();    // NoReturn);
373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3742462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3744b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3745b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
3746b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ParmVarDecl::Create(*ast,
3747b01000fd063629facd45044f137446fb748ee179Greg Clayton                                ast->getTranslationUnitDecl(),
374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
3749279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                SourceLocation(),
3750b01000fd063629facd45044f137446fb748ee179Greg Clayton                                name && name[0] ? &ast->Idents.get(name) : NULL,
37512ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
375224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
375324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
375624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
375724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
375824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
375924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
376024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
376124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
376224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
376324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
376424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
376524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3768462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3769462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
377124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
377224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3773b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3774b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
3776b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
377724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
377824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
378324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
378724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3788462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
378924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
379124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
379224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3793d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *t = qual_type.getTypePtr();
379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3796d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const TagType *tag_type = dyn_cast<TagType>(t);
379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3812462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
381755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
381855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
381955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
382055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
382255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
382355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
382455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
382555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
382655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3827d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
382804325065a00f646527db85e9bc751da29ac53b23Sean Callanan
382904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        if (objc_class_type)
383004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
383104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
383204325065a00f646527db85e9bc751da29ac53b23Sean Callanan
383304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            class_interface_decl->setForwardDecl(false);
383404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
383504325065a00f646527db85e9bc751da29ac53b23Sean Callanan
383655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
383755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
383855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
383955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
384055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
384155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
384255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
384455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
384555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
384655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
384755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
384855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3849b01000fd063629facd45044f137446fb748ee179Greg Clayton                ASTContext *ast = getASTContext();
385048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
385148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                QualType promotion_qual_type;
385248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // If the enum integer type is less than an integer in bit width,
385348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // then we must promote it to an integer size.
3854b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
385548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                {
385648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
3857b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->IntTy;
385848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    else
3859b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->UnsignedIntTy;
386048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                }
386148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                else
386248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
386348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
386448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
386555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
386924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
387424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3875462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
38760d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType
38770d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton(
38780d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const char *name,
38790d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    DeclContext *decl_ctx,
38800d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const Declaration &decl,
38810d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    clang_type_t integer_qual_type
38820d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton)
388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
3886b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3887b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
388848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
388948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    // TODO: ask about these...
389048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsScoped = false;
389148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsFixed = false;
389248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
3893b01000fd063629facd45044f137446fb748ee179Greg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast,
38940d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                                            decl_ctx,
389548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
389648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
3897279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                            name && name[0] ? &ast->Idents.get(name) : NULL,
38989e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            NULL,
38999e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScoped
39009e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScopedUsingClassTag
39019e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false); // IsFixed
3902864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3903864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3905e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3906e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3907e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
3908864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3909864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
3910864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3911b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
3912e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3916462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3917462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3918462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3919462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3920462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3921d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *clang_type = enum_qual_type.getTypePtr();
3922462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3923462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3924462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3925462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3926462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3927462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3928462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3929462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3930462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3931462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3932462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3933462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
393424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
393524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
393624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3937462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3938462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
394224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
394324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
394724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
3949b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
395024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
395124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3952b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3956d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *clang_type = enum_qual_type.getTypePtr();
395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
396124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
396324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
396424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
396524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
3966b01000fd063629facd45044f137446fb748ee179Greg Clayton                    EnumConstantDecl::Create (*ast,
3967b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_type->getDecl(),
3968b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              SourceLocation(),
3969b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              name ? &identifier_table->get(name) : NULL,    // Identifier
3970b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              QualType::getFromOpaquePtr(enumerator_clang_type),
3971b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              NULL,
3972b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_llvm_apsint);
3973b01000fd063629facd45044f137446fb748ee179Greg Clayton
397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3987462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3988462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return CreatePointerType (getASTContext(), clang_type);
3991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t
3994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
3995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
3996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (ast && clang_type)
39977b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
39987b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
39997b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
400003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
400103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
40027b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
40037b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
40047b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
4005427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
40067b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
40077b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
4008427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getPointerType(qual_type).getAsOpaquePtr();
40097b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
40107b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4014462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
40156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
40166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
40196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
402024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4023462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
40246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
40256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
402624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
40286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
402924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4032462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4033462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
4034fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
4035fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
4036fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
4037fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
4038fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
4039fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
4040fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
4041bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t
404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4044b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
4045b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTypeSize(ast->VoidPtrTy);
404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
404724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4049917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
4050917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
4051917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    QualType pointee_qual_type;
4052917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (clang_type)
4053917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    {
4054917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4055917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4056917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        bool success = false;
4057917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        switch (type_class)
4058917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
4059917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::Builtin:
4060917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
4061917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                {
4062917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    if (dynamic_pointee_type)
4063917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        *dynamic_pointee_type = clang_type;
4064917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    return true;
4065917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                }
4066917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4067917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4068917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::ObjCObjectPointer:
4069917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                if (dynamic_pointee_type)
4070917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
4071917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                return true;
4072917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4073917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::Pointer:
4074917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
4075917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                success = true;
4076917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4077917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4078917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::LValueReference:
4079917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::RValueReference:
4080917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
4081917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                success = true;
4082917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4083917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4084917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            case clang::Type::Typedef:
4085917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
4086917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4087917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            default:
4088917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                break;
4089917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
4090917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4091917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (success)
4092917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
4093917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // Check to make sure what we are pointing too is a possible dynamic C++ type
4094917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // We currently accept any "void *" (in case we have a class that has been
4095917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // watered down to an opaque pointer) and virtual C++ classes.
4096917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
4097917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            switch (pointee_type_class)
4098917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
4099917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::Builtin:
4100917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
4101917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    {
4102917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UnknownAny:
4103917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Void:
4104917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (dynamic_pointee_type)
4105917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4106917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            return true;
4107917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4108917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::NullPtr:
4109917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Bool:
4110917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char_U:
4111917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UChar:
4112917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::WChar_U:
4113917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char16:
4114917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char32:
4115917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UShort:
4116917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UInt:
4117917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ULong:
4118917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ULongLong:
4119917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::UInt128:
4120917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Char_S:
4121917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::SChar:
4122917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::WChar_S:
4123917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Short:
4124917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Int:
4125917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Long:
4126917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::LongLong:
4127917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Int128:
4128917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Float:
4129917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Double:
4130917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::LongDouble:
4131917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Dependent:
4132917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::Overload:
4133917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ObjCId:
4134917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ObjCClass:
4135917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::ObjCSel:
4136917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        case clang::BuiltinType::BoundMember:
4137917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            break;
4138917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    }
4139917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4140917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4141917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::Record:
4142917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    {
4143917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
4144917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        if (cxx_record_decl)
4145917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        {
4146917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (GetCompleteQualType (ast, pointee_qual_type))
4147917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            {
4148917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                success = cxx_record_decl->isDynamicClass();
4149917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            }
4150917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            else
4151917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            {
4152917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                // We failed to get the complete type, so we have to
4153917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                // treat this as a void * which we might possibly be
4154917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                // able to complete
4155917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                success = true;
4156917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            }
4157917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (success)
4158917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            {
4159917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                if (dynamic_pointee_type)
4160917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                    *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4161917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                return true;
4162917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            }
4163917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        }
4164917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    }
4165917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4166917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4167917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::ObjCObject:
4168917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                case clang::Type::ObjCInterface:
4169917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    {
4170917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType();
4171917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        if (objc_class_type)
4172917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        {
4173917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            GetCompleteQualType (ast, pointee_qual_type);
4174917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            if (dynamic_pointee_type)
4175917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
4176917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                            return true;
4177917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                        }
4178917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    }
4179917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4180917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4181917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                default:
4182917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                    break;
4183917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
4184917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        }
4185917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    }
4186917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (dynamic_pointee_type)
4187917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        *dynamic_pointee_type = NULL;
4188917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return false;
4189917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
4190917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4191917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
4192917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
419382f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
419482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
419582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    QualType pointee_qual_type;
419682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (clang_type)
419782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    {
419882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
419982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
420082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        bool success = false;
420182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        switch (type_class)
420282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        {
420382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Pointer:
420482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
420582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                success = true;
420682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
420782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
420882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::LValueReference:
420982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::RValueReference:
421082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
421182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                success = true;
421282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
421382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
421482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Typedef:
421582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type);
421682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
421782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            default:
421882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
421982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
422082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
422182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (success)
422282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        {
422382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            // Check to make sure what we are pointing too is a possible dynamic C++ type
422482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            // We currently accept any "void *" (in case we have a class that has been
422582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            // watered down to an opaque pointer) and virtual C++ classes.
422682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
422782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            switch (pointee_type_class)
422882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            {
422982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Builtin:
423082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
423182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                {
423282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UnknownAny:
423382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Void:
423482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (dynamic_pointee_type)
423582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
423682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        return true;
423782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
423882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::NullPtr:
423982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Bool:
424082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char_U:
424182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UChar:
424282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::WChar_U:
424382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char16:
424482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char32:
424582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UShort:
424682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UInt:
424782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ULong:
424882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ULongLong:
424982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::UInt128:
425082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Char_S:
425182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::SChar:
425282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::WChar_S:
425382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Short:
425482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Int:
425582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Long:
425682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::LongLong:
425782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Int128:
425882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Float:
425982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Double:
426082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::LongDouble:
426182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Dependent:
426282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::Overload:
426382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ObjCId:
426482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ObjCClass:
426582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::ObjCSel:
426682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    case clang::BuiltinType::BoundMember:
426782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        break;
426882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                }
426982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
427082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            case clang::Type::Record:
427182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                {
427282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
427382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    if (cxx_record_decl)
427482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    {
427582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (GetCompleteQualType (ast, pointee_qual_type))
427682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
42770f5e6f1a01b340d463fbdc692f3af492774a5ec4Greg Clayton                            success = cxx_record_decl->isDynamicClass();
427882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
427982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        else
428082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
428182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            // We failed to get the complete type, so we have to
428282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            // treat this as a void * which we might possibly be
428382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            // able to complete
428482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            success = true;
428582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
428682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        if (success)
428782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        {
428882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            if (dynamic_pointee_type)
428982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
429082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            return true;
429182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                        }
429282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                    }
429382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                }
429482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
429582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
429682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            default:
429782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                break;
429882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            }
429982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        }
430082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    }
430182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (dynamic_pointee_type)
430282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        *dynamic_pointee_type = NULL;
430382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return false;
430482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
430582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
430682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
430782f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
4308462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
431024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
431224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
431324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
431403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
431503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
431624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
431704325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
431804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
431904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
432004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        default:
432104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            break;
432204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
432304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
432404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return true;
432504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
432604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return false;
43271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
433224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
433324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
433724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
434224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
434924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
43511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
43529e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4360462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
437324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
437424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
437524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
437624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
437724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
437824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4380462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
438124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
438503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
438603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
438804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::Type::Builtin:
438904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            switch (cast<clang::BuiltinType>(qual_type)->getKind())
439004325065a00f646527db85e9bc751da29ac53b23Sean Callanan            {
439104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            default:
439204325065a00f646527db85e9bc751da29ac53b23Sean Callanan                break;
439304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCId:
439404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCClass:
439504325065a00f646527db85e9bc751da29ac53b23Sean Callanan                return true;
439604325065a00f646527db85e9bc751da29ac53b23Sean Callanan            }
439704325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return false;
43981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
440324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
440924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
441124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
441224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
44141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
44159e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
441824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
442224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4424462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
442524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
442624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
443024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
443124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
443224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
443324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
443424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
443524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
443624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
443724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
443824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
443924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
444024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
444124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
444224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
444324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
444424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
444524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
444624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
444724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
444824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
444924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
445024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
445124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
445224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
445324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
445424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
445524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
445624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
445724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
445824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
445924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
446024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
446124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4462bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4463bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool
4464bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
4465bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
4466bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type)
4467bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
4468bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4469bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4470bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4471bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (cxx_record_decl)
4472bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
4473bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
4474bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return true;
4475bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
4476bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
4477bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    class_name.clear();
4478bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return false;
4479bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
4480bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4481bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
44821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4483462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
44841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
44851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
44861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
44871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
44881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
44891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
44901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
44911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
44921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
44931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
44941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4495462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
44961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
44971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
44981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
44991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
45001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
45011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
45021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
45031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
45041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
45051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
45061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
4507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool
4508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type)
4509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return QualType::getFromOpaquePtr(clang_type)->isCharType();
4512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return false;
4513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
451424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
451524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4516462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
451724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t pointee_or_element_clang_type = NULL;
4519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
4520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type == NULL)
4522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return false;
4523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4524f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
452524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4526f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
4527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4528f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
452924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4530f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4531f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (type_flags.Test (eTypeIsArray))
453224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4533f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We know the size of the array and it could be a C string
4534f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // since it is an array of characters
4535f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4536f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
453724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
4538f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
453924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4540f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = 0;
4541f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
454224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
454324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
454424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
454524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
454624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
454724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
454824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
454924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4550462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
455103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
455203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
455303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
455403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
455503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
455603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
455703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
455803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
455903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
456003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
456103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
4562279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        default:
4563279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
456403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
45659e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
456603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
456703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
456803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
456903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
4570d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
457103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
457203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
457303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
457403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
457503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
457603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
457703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
457803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
457903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
4580f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t
4581f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type)
4582f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4583f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4584f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
4585d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
4586f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (array)
4587f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return array->getSize().getLimitedValue();
4588f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
4589f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return 0;
4590f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
459103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
459203e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
4593462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
459424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
459524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
459624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
459724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
459824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
459924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
460003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
460103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
460224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4603279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    default:
4604279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        break;
46051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
460624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
460724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
460824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
4609381f968161e2274c55706ead0baed444a26b5092Greg Clayton            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
461024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
46111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
461224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
461324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
461424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
461524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
461624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
46171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
461824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
461924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
462024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
462124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
46225aad3f5581aec9ee62277d92b11cba7abf837dbdGreg Clayton        return true;
46231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
462424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
462524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
462624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
462724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
462824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
462924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
463024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
463124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
463224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
463324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
463424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
463524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4636462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4637462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
463824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
463924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
464024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
464124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4642b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
464324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
4644b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
464524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
464624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
4647b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
4648b01000fd063629facd45044f137446fb748ee179Greg Clayton        TypedefDecl *decl = TypedefDecl::Create (*ast,
4649b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 decl_ctx,
4650b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 SourceLocation(),
4651279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                 SourceLocation(),
4652b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 name ? &identifier_table->get(name) : NULL, // Identifier
4653b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 ast->CreateTypeSourceInfo(qual_type));
4654864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
4655864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        decl->setAccess(AS_public); // TODO respect proper access specifier
465624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
465724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
4658b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTypedefType (decl).getAsOpaquePtr();
465924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
466024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
466124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
466224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
466324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
466424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
466524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
466624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
466724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
466824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
466924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
4670b01000fd063629facd45044f137446fb748ee179Greg 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)
467124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
467224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
467324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
467424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
467524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
467624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
467724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
467824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
467924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
468024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
468124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
468224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
468324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
468424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
468524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
468624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
468724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
468824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
468924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
469024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
469124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
469224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
469324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
469424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
469524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
469624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
469724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
469824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
469924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
470024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
470124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
470224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
470324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
470424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
4705b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
470624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
470724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
470824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
470924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
471024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
471124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
471224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
471324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
471424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
471524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
471624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
471724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
471824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
4719b01000fd063629facd45044f137446fb748ee179Greg Clayton            APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
472024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4721b01000fd063629facd45044f137446fb748ee179Greg Clayton            const uint64_t bit_size = ast->getTypeSize (qual_type);
472224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
472324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
472424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
472524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
472624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
472724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
472824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
472924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
473024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
473124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
473224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
473324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
473424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
473524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
473624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
473724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
473824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
473924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
474024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
474124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4742a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4743a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
4744462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
4745a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
4746a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
4747a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4748a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4749a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4750a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
4751a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
4752b01000fd063629facd45044f137446fb748ee179Greg Clayton
4753b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4754b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
4755b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4756b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
4757b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
4758b01000fd063629facd45044f137446fb748ee179Greg Clayton
47597a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton    return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
4760b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4761b01000fd063629facd45044f137446fb748ee179Greg Clayton
4762b01000fd063629facd45044f137446fb748ee179Greg Clayton
4763b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4764b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type)
4765b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4766b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
4767b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4768b01000fd063629facd45044f137446fb748ee179Greg Clayton
4769e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Claytonbool
4770e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg ClaytonClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
4771e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                  clang::Decl *decl)
4772e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
4773e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (!decl)
4774e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
4775e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4776e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ExternalASTSource *ast_source = ast->getExternalSource();
4777e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4778e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (!ast_source)
4779e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
4780e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4781e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
4782e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
4783e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (tag_decl->getDefinition())
4784e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return true;
4785e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4786e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!tag_decl->hasExternalLexicalStorage())
4787e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return false;
4788e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4789e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ast_source->CompleteType(tag_decl);
4790e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4791e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return !tag_decl->getTypeForDecl()->isIncompleteType();
4792e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
4793e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
4794e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
4795e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!objc_interface_decl->isForwardDecl())
4796e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return true;
4797e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4798e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!objc_interface_decl->hasExternalLexicalStorage())
4799e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return false;
4800e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4801e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ast_source->CompleteType(objc_interface_decl);
4802e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4803e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return !objc_interface_decl->isForwardDecl();
4804e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
4805e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    else
4806e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
4807e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
4808e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
4809e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
4810e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
4811