ClangASTContext.cpp revision 0de254aaec7d6766379191e5397ec2294042c5d7
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"
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
63f05633b35544b5d095feb05680c8728be087e441Eli Friedman
64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69b01000fd063629facd45044f137446fb748ee179Greg Clayton
70b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic bool
71b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
72b01000fd063629facd45044f137446fb748ee179Greg Clayton{
73b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
74b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
75b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
76b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
77b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
78b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
79d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
80b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (tag_type)
81b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
82b01000fd063629facd45044f137446fb748ee179Greg Clayton                clang::TagDecl *tag_decl = tag_type->getDecl();
83b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (tag_decl)
84b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
85b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (tag_decl->getDefinition())
86b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return true;
87b01000fd063629facd45044f137446fb748ee179Greg Clayton
88b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (tag_decl->hasExternalLexicalStorage())
89b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
90b01000fd063629facd45044f137446fb748ee179Greg Clayton                        ExternalASTSource *external_ast_source = ast->getExternalSource();
91b01000fd063629facd45044f137446fb748ee179Greg Clayton                        if (external_ast_source)
92b01000fd063629facd45044f137446fb748ee179Greg Clayton                        {
93b01000fd063629facd45044f137446fb748ee179Greg Clayton                            external_ast_source->CompleteType(tag_decl);
94b01000fd063629facd45044f137446fb748ee179Greg Clayton                            return !tag_type->isIncompleteType();
95b01000fd063629facd45044f137446fb748ee179Greg Clayton                        }
96b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
97b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return false;
98b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
99b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
100b01000fd063629facd45044f137446fb748ee179Greg Clayton
101b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
102b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
103b01000fd063629facd45044f137446fb748ee179Greg Clayton
104b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
105b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
106b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
107d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
108b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
109b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
110b01000fd063629facd45044f137446fb748ee179Greg Clayton                clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
111b01000fd063629facd45044f137446fb748ee179Greg Clayton                // We currently can't complete objective C types through the newly added ASTContext
112b01000fd063629facd45044f137446fb748ee179Greg Clayton                // because it only supports TagDecl objects right now...
113b01000fd063629facd45044f137446fb748ee179Greg Clayton                bool is_forward_decl = class_interface_decl->isForwardDecl();
114b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
115b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
116b01000fd063629facd45044f137446fb748ee179Greg Clayton                    ExternalASTSource *external_ast_source = ast->getExternalSource();
117b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (external_ast_source)
118b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
119b01000fd063629facd45044f137446fb748ee179Greg Clayton                        external_ast_source->CompleteType (class_interface_decl);
120b01000fd063629facd45044f137446fb748ee179Greg Clayton                        is_forward_decl = class_interface_decl->isForwardDecl();
121b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
1227a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    return is_forward_decl == false;
123b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1247a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                return true;
125b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
126b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
127b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
128b01000fd063629facd45044f137446fb748ee179Greg Clayton
129b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
130b01000fd063629facd45044f137446fb748ee179Greg Clayton        return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
131b01000fd063629facd45044f137446fb748ee179Greg Clayton
132b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
133b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
134b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
135b01000fd063629facd45044f137446fb748ee179Greg Clayton
136b01000fd063629facd45044f137446fb748ee179Greg Clayton    return true;
137b01000fd063629facd45044f137446fb748ee179Greg Clayton}
138b01000fd063629facd45044f137446fb748ee179Greg Clayton
139b01000fd063629facd45044f137446fb748ee179Greg Clayton
14084f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
141585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access)
14284f8075072eef306234f8109573067647735c111Greg Clayton{
14384f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
14484f8075072eef306234f8109573067647735c111Greg Clayton    {
145585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
146585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
147585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
148585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
149585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
15084f8075072eef306234f8109573067647735c111Greg Clayton    }
15184f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
15284f8075072eef306234f8109573067647735c111Greg Clayton}
15384f8075072eef306234f8109573067647735c111Greg Clayton
15484f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
155585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
15684f8075072eef306234f8109573067647735c111Greg Clayton{
15784f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
15884f8075072eef306234f8109573067647735c111Greg Clayton    {
159585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
160585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return ObjCIvarDecl::None;
161585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return ObjCIvarDecl::Public;
162585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return ObjCIvarDecl::Private;
163585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return ObjCIvarDecl::Protected;
164585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPackage:   return ObjCIvarDecl::Package;
16584f8075072eef306234f8109573067647735c111Greg Clayton    }
16684f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
16784f8075072eef306234f8109573067647735c111Greg Clayton}
16884f8075072eef306234f8109573067647735c111Greg Clayton
16984f8075072eef306234f8109573067647735c111Greg Clayton
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
174e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
182e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
184e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
185e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
186e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
187e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
196e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
197e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
198279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_LLVM_IR:
199b01000fd063629facd45044f137446fb748ee179Greg Clayton                assert (!"Invalid input kind!");
200e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
203279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_CUDA:
204279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                LangStd = LangStandard::lang_cuda;
205279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                break;
206e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
207e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
208e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
209e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
210e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
213e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
214e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
215e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
216e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
2648950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan        Opts.setVisibilityMode(DefaultVisibility);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
339b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) :
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
341b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap(),
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
349b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_builtins_ap(),
350b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_tag_decl (NULL),
351b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_objc_decl (NULL),
352b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_baton (NULL)
353b01000fd063629facd45044f137446fb748ee179Greg Clayton
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
372b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
379b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
403395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid
404395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch)
405395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{
406395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    Clear();
407395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    m_target_triple.assign(arch.GetTriple().str());
408395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton}
409395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton
410b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
411b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource ()
412b01000fd063629facd45044f137446fb748ee179Greg Clayton{
413b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
414b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
415b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getExternalSource () != NULL;
416b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
417b01000fd063629facd45044f137446fb748ee179Greg Clayton}
418b01000fd063629facd45044f137446fb748ee179Greg Clayton
419b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
420b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
421b01000fd063629facd45044f137446fb748ee179Greg Clayton{
422b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
423b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
424b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
425b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (ast_source_ap);
426b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
427b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
428b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
429b01000fd063629facd45044f137446fb748ee179Greg Clayton}
430b01000fd063629facd45044f137446fb748ee179Greg Clayton
431b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
432b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource ()
433b01000fd063629facd45044f137446fb748ee179Greg Clayton{
434b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
435b01000fd063629facd45044f137446fb748ee179Greg Clayton
436b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
437b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
438b01000fd063629facd45044f137446fb748ee179Greg Clayton        llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
439b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (empty_ast_source_ap);
440b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
441b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
442b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
443b01000fd063629facd45044f137446fb748ee179Greg Clayton}
444b01000fd063629facd45044f137446fb748ee179Greg Clayton
445b01000fd063629facd45044f137446fb748ee179Greg Clayton
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
450b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get() == NULL)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
452b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
453b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSourceManager(),
454b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getTargetInfo(),
455b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getIdentifierTable(),
456b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSelectorTable(),
457b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getBuiltinContext(),
458b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       0));
459887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
460b01000fd063629facd45044f137446fb748ee179Greg Clayton        if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
461b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
462b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
463b01000fd063629facd45044f137446fb748ee179Greg Clayton            //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
464b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
465b01000fd063629facd45044f137446fb748ee179Greg Clayton
466b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
468b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast_ap.get();
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
493e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
494e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5078a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
5088a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
5098a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
5108a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
51122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    {
51222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        clang::FileSystemOptions file_system_options;
51322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
51422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    }
5158a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
5168a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
5178a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
5181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
52222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
530eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    {
531eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
532eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
533eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    }
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
537887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient
538887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
539887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic:
540887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    NullDiagnosticClient ()
541887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
542887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
543887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
544887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
545887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
546887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
547887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        if (m_log)
548887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        {
549887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            llvm::SmallVectorImpl<char> diag_str(10);
550887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            info.FormatDiagnostic(diag_str);
551887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            diag_str.push_back('\0');
552887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
553887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        }
554887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
555887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate:
556887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    LogSP m_log;
557887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan};
558887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
559887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient *
560887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient()
561887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
562887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    if (m_diagnostic_client_ap.get() == NULL)
563887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_diagnostic_client_ap.reset(new NullDiagnosticClient);
564887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
565887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    return m_diagnostic_client_ap.get();
566887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}
567887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
593b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
595b01000fd063629facd45044f137446fb748ee179Greg Clayton    uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
601462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
602585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
604b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
606b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
608b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
611462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
612b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
614b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
619585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
620b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
621b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->VoidPtrTy.getAsOpaquePtr();
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
624585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
625b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
626b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedCharTy.getAsOpaquePtr();
627b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
628b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedShortTy.getAsOpaquePtr();
629b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
630b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedIntTy.getAsOpaquePtr();
631b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
632b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongTy.getAsOpaquePtr();
633b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
634b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongLongTy.getAsOpaquePtr();
635b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
636b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedInt128Ty.getAsOpaquePtr();
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
639585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
640b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
641b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->CharTy.getAsOpaquePtr();
642b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
643b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->ShortTy.getAsOpaquePtr();
644b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
645b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->IntTy.getAsOpaquePtr();
646b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
647b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongTy.getAsOpaquePtr();
648b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
649b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongLongTy.getAsOpaquePtr();
650b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
651b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->Int128Ty.getAsOpaquePtr();
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
654585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
655b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
656b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->FloatTy.getAsOpaquePtr();
657b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
658b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->DoubleTy.getAsOpaquePtr();
659b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
660b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongDoubleTy.getAsOpaquePtr();
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
663585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
671462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
674b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
677b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
678b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
686b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
687b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->VoidPtrTy.getAsOpaquePtr();
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
691b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
692b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->BoolTy.getAsOpaquePtr();
693b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
694b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
695b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
696b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
697b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
698b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
701e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        case DW_ATE_lo_user:
702e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            // This has been seen to mean DW_AT_complex_integer
7039353338e34d711856c80754721fe425bc765c6f3Greg Clayton            if (::strstr(type_name, "complex"))
704e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
705e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
706b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
707e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
708e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            break;
709e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
711b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
712b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatComplexTy.getAsOpaquePtr();
713b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
714b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleComplexTy.getAsOpaquePtr();
715b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
716b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleComplexTy.getAsOpaquePtr();
717e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else
718e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
719e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
720b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
721e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
725b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
726b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatTy.getAsOpaquePtr();
727b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
728b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleTy.getAsOpaquePtr();
729b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
730b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleTy.getAsOpaquePtr();
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7368ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
738b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
739b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongLongTy.getAsOpaquePtr();
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7418ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
743b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
744b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongTy.getAsOpaquePtr();
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
748b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
749b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->ShortTy.getAsOpaquePtr();
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7518ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
753b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
754b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->CharTy.getAsOpaquePtr();
755b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
756b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7588ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
7598ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
760b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
761b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->IntTy.getAsOpaquePtr();
762b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
763b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->Int128Ty.getAsOpaquePtr();
7648ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
7658ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (streq(type_name, "wchar_t"))
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
767b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
768b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->WCharTy.getAsOpaquePtr();
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7707bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                else if (streq(type_name, "void"))
7717bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                {
7727bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
7737bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                        return ast->VoidTy.getAsOpaquePtr();
7747bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                }
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
777b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
778b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
779b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
780b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ShortTy.getAsOpaquePtr();
781b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
782b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->IntTy.getAsOpaquePtr();
783b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
784b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongTy.getAsOpaquePtr();
785b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
786b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongLongTy.getAsOpaquePtr();
787b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
788b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->Int128Ty.getAsOpaquePtr();
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
796b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
797b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
800b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
801b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
802b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
803b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->SignedCharTy.getAsOpaquePtr();
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
8098ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
811b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
812b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongLongTy.getAsOpaquePtr();
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8148ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
816b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
817b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongTy.getAsOpaquePtr();
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8198ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
821b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
822b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedShortTy.getAsOpaquePtr();
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
826b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
827b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedCharTy.getAsOpaquePtr();
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
8308ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
831b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
832b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedIntTy.getAsOpaquePtr();
833b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
834b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedInt128Ty.getAsOpaquePtr();
8358ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
838b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
839b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
840b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
841b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
842b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
843b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
844b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
845b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongTy.getAsOpaquePtr();
846b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
847b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongLongTy.getAsOpaquePtr();
848b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
849b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedInt128Ty.getAsOpaquePtr();
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
853b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
854b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
8557bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
8567bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
869462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
870b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast)
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
872b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->VoidTy.getAsOpaquePtr();
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
875462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
876a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool()
877a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{
878a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan    return getASTContext()->BoolTy.getAsOpaquePtr();
879a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan}
880a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
881a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t
882960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
883960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
884c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
885960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
886960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
887462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
888960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
889960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
89004325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
891960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
892960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
893462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
894960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
895960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
896c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
897960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
898960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
899462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
900fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
901fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
902fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return ast->UnknownAnyTy.getAsOpaquePtr();
903fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
904fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
905fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananclang_type_t
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
916462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
922462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
923b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
925b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType void_ptr_type(ast->VoidPtrTy);
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
933462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
93422defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast,
93522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
936462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9388a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
93922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
94022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
941ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
942ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
943cf18faaf72090a68480145ca206955d792633559Sean Callanan
94422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType src (QualType::getFromOpaquePtr(clang_type));
94522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType dst (importer.Import(src));
946cf18faaf72090a68480145ca206955d792633559Sean Callanan
947cf18faaf72090a68480145ca206955d792633559Sean Callanan    return dst.getAsOpaquePtr();
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9516916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
95222defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast,
95322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
9546916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
955887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
9568a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
95722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
95822defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
959ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
960ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
9616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
9636916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
9646916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9658d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
966b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast,
967462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
968462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
9695510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
97004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    return ast->hasSameType (QualType::getFromOpaquePtr(type1),
97104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton                             QualType::getFromOpaquePtr(type2));
9725510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
9735510dddc33260a991284ef81ca343594f23262e8Sean Callanan
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
976462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
977462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
988462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
989462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1000462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1001462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1012b01000fd063629facd45044f137446fb748ee179Greg Clayton
1013b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1014b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl)
1015b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1016b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1017b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1018b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1019b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1020b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
1021b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1022b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1023b01000fd063629facd45044f137446fb748ee179Greg Clayton
1024b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1025b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1026b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1027b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1028b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1029b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1030b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1031b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1032b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1033b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1034b01000fd063629facd45044f137446fb748ee179Greg Clayton
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1037462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1038585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1040b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1041b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
104204325065a00f646527db85e9bc751da29ac53b23Sean Callanan
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
1044b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1047585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
10489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1049306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
10509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
10519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
10529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
10539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
1059b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
1063279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                SourceLocation(),
1064b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                name && name[0] ? &ast->Idents.get(name) : NULL);
1065b01000fd063629facd45044f137446fb748ee179Greg Clayton
1066b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTagDeclType(decl).getAsOpaquePtr();
1067b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1068b01000fd063629facd45044f137446fb748ee179Greg Clayton
1069b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
1070b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1071b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1072b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
1073b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
1074b01000fd063629facd45044f137446fb748ee179Greg Clayton
1075b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1076b01000fd063629facd45044f137446fb748ee179Greg Clayton
1077b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1078b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
1079b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1080b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
1081b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1082b01000fd063629facd45044f137446fb748ee179Greg Clayton            CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1083b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (cxx_record_decl)
1084b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1085b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_record_decl->setHasExternalLexicalStorage (has_extern);
10867a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                cxx_record_decl->setHasExternalVisibleStorage (has_extern);
1087b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1088b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1089b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1090b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1091b01000fd063629facd45044f137446fb748ee179Greg Clayton
1092b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
1093b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1094b01000fd063629facd45044f137446fb748ee179Greg Clayton            EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1095b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (enum_decl)
1096b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1097b01000fd063629facd45044f137446fb748ee179Greg Clayton                enum_decl->setHasExternalLexicalStorage (has_extern);
10987a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                enum_decl->setHasExternalVisibleStorage (has_extern);
1099b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1100b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1101b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1102b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1103b01000fd063629facd45044f137446fb748ee179Greg Clayton
1104b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
1105b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
1106b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1107d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
1108b01000fd063629facd45044f137446fb748ee179Greg Clayton            assert (objc_class_type);
1109b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
1110b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1111b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1112b01000fd063629facd45044f137446fb748ee179Greg Clayton
1113b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (class_interface_decl)
1114b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
1115b01000fd063629facd45044f137446fb748ee179Greg Clayton                    class_interface_decl->setHasExternalLexicalStorage (has_extern);
11167a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    class_interface_decl->setHasExternalVisibleStorage (has_extern);
1117b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return true;
1118b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1119b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1120b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1121b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1123b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
1124b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
1125b01000fd063629facd45044f137446fb748ee179Greg Clayton
1126b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
1127b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1128b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1129b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1132dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
1133dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
1134dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
1135dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
1136dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
1137dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1138494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator"
1139427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
1140c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1141c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    const char *post_op_name = NULL;
1142c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1143494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    bool no_space = true;
1144c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1145427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
1146494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        return false;
1147494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan
1148427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
1149427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1150494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    if (post_op_name[0] == ' ')
1151c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    {
1152494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        post_op_name++;
1153494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        no_space = false;
1154c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    }
1155c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1156494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX
1157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH
1158dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
1164dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
1165c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    default:
1166c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1167c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1168c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        break;
1169dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
1170c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1171c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1172dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
1173dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
1174dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
1175dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1177dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1178dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
1179c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1180c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1181dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
1182dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
1183dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1192dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
1193dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1197dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1321dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1322dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1323dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1324dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1325dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1326dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1327dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1328dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1329dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1330dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1331dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1332dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1333dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1334dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1335dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1336dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1337dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1338dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1339dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1340dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1341dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1342dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1343dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1344dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1345dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1346dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1347b01000fd063629facd45044f137446fb748ee179Greg Clayton
1348412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
1349795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
1350795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1351b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1352462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1353412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1354462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1355412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
13561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
13571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
135830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
135930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1360412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1361795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
13623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1363974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1364795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1365b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(ast);
1366795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1367b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
1368795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1369795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1370795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
13713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
13721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1373b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
1374795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
13751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1376412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1377795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
13781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
13791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
138030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
13813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
138230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
138390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
138490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
138590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
1386d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
138790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
13885325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
138990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
139090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
1391d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
139230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
139390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
139490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
139590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
139690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
139790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
139890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
139990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1400b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast,
140190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1402279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation(),
1403b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                     DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
140490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
14058950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                                     NULL,
140690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
140790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
140890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
1409b01000fd063629facd45044f137446fb748ee179Greg Clayton    else if (decl_name == cxx_record_decl->getDeclName())
141030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
1411b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast,
141230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
1413279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                      SourceLocation(),
1414b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                      DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
141530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
141630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
141730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
141830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
141930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
142030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
142130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
142290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1423dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1424dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1425dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
142690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1427dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1428dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1429b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast,
143090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1431279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         SourceLocation(),
1432b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
143490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1435dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1436dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1437279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         is_inline,
1438279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                         SourceLocation());
1439dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1440dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1441dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1442dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1443b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast,
1444dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
1445279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             SourceLocation(),
1446b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                             DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1447dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1448dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1449dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1450279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             is_explicit,
1451279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                             SourceLocation());
1452dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
145390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1454dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1455dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
145690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1457b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast,
145890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1459279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation(),
1460dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
146190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
146290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
146390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
146490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
1465279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     is_inline,
1466279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                     SourceLocation());
146790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
146830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1469dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1470462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
147147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
14721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
14731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
147447a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
14753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
14763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ParmVarDecl *params[num_params];
14783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
14803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
14813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
14823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1483b01000fd063629facd45044f137446fb748ee179Greg Clayton        params[param_index] = ParmVarDecl::Create (*ast,
14841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   cxx_method_decl,
14851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
1486279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                   SourceLocation(),
14871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
14881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
14891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
14901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
14911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
14921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL);
14933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
14943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setParams (params, num_params);
14963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
14987a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton
14997a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPolymorphic()             = %i\n", cxx_record_decl->isPolymorphic());
15007a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAggregate()               = %i\n", cxx_record_decl->isAggregate());
15017a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPOD()                     = %i\n", cxx_record_decl->isPOD());
15027a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isEmpty()                   = %i\n", cxx_record_decl->isEmpty());
15037a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAbstract()                = %i\n", cxx_record_decl->isAbstract());
15047a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialConstructor()     = %i\n", cxx_record_decl->hasTrivialConstructor());
15057a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
15067a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyAssignment()  = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
15077a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialDestructor()      = %i\n", cxx_record_decl->hasTrivialDestructor());
1508412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1509795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1510795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1511795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
151284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
151384f8075072eef306234f8109573067647735c111Greg Clayton(
1514b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1515462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
151684f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1517462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
151884f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
151984f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
152084f8075072eef306234f8109573067647735c111Greg Clayton)
152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1525b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1527b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1532d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *clang_type = record_qual_type.getTypePtr();
153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1544b01000fd063629facd45044f137446fb748ee179Greg Clayton                APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1545b01000fd063629facd45044f137446fb748ee179Greg Clayton                bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1547b01000fd063629facd45044f137446fb748ee179Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast,
154884f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
154984f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
1550279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                  SourceLocation(),
155184f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
155284f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
155384f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
155484f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
155584f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155784f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
15659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
1566d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
15679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
15689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
15691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
1570b01000fd063629facd45044f137446fb748ee179Greg Clayton                ClangASTContext::AddObjCClassIVar (ast,
157160a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
15729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
15761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
15789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
1592b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1597b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast == NULL || field == NULL)
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
1606b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1643b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1645b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1647b01000fd063629facd45044f137446fb748ee179Greg Clayton        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1648b01000fd063629facd45044f137446fb748ee179Greg Clayton
1649d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
1650b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (record_type)
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1652b01000fd063629facd45044f137446fb748ee179Greg Clayton            RecordDecl *record_decl = record_type->getDecl();
1653b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (record_decl)
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1655b01000fd063629facd45044f137446fb748ee179Greg Clayton                uint32_t field_idx;
1656b01000fd063629facd45044f137446fb748ee179Greg Clayton                RecordDecl::field_iterator field, field_end;
1657b01000fd063629facd45044f137446fb748ee179Greg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1658b01000fd063629facd45044f137446fb748ee179Greg Clayton                     field != field_end;
1659b01000fd063629facd45044f137446fb748ee179Greg Clayton                     ++field, ++field_idx)
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
1661b01000fd063629facd45044f137446fb748ee179Greg Clayton                    // If no accessibility was assigned, assign the correct one
1662b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1663b01000fd063629facd45044f137446fb748ee179Greg Clayton                        field->setAccess ((AccessSpecifier)default_accessibility);
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1673462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
16766e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
16776e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
16786e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
16796e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
1680ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1681ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     SourceLocation());
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1685e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1686e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1687e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1688e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1689e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1690e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1691e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1692e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1693e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1694e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1696462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1700b01000fd063629facd45044f137446fb748ee179Greg Clayton        CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
1701b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (cxx_record_decl)
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1703b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_record_decl->setBases(base_classes, num_base_classes);
1704b01000fd063629facd45044f137446fb748ee179Greg Clayton            return true;
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
170984f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
171084f8075072eef306234f8109573067647735c111Greg Clayton
1711462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
171284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
171384f8075072eef306234f8109573067647735c111Greg Clayton(
171484f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
171584f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
171684f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
171784f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
171884f8075072eef306234f8109573067647735c111Greg Clayton)
171984f8075072eef306234f8109573067647735c111Greg Clayton{
1720b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1721b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
172284f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
172384f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
1724b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
172584f8075072eef306234f8109573067647735c111Greg Clayton
172684f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
172784f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
172884f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
172984f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
173084f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
1731b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
173284f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
173384f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
1734b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         &ast->Idents.get(name),
173584f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
173684f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
173784f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
17389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1739b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
174084f8075072eef306234f8109573067647735c111Greg Clayton}
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174284f8075072eef306234f8109573067647735c111Greg Claytonbool
1743462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
174484f8075072eef306234f8109573067647735c111Greg Clayton{
174584f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
174684f8075072eef306234f8109573067647735c111Greg Clayton    {
174784f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
174884f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
1749d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *class_type = class_qual_type.getTypePtr();
1750d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *super_type = super_qual_type.getTypePtr();
175184f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
175284f8075072eef306234f8109573067647735c111Greg Clayton        {
1753d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
1754d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
175584f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
175684f8075072eef306234f8109573067647735c111Greg Clayton            {
175784f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
175884f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
175984f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
176084f8075072eef306234f8109573067647735c111Greg Clayton                {
176184f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
176284f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
176384f8075072eef306234f8109573067647735c111Greg Clayton                }
176484f8075072eef306234f8109573067647735c111Greg Clayton            }
176584f8075072eef306234f8109573067647735c111Greg Clayton        }
176684f8075072eef306234f8109573067647735c111Greg Clayton    }
176784f8075072eef306234f8109573067647735c111Greg Clayton    return false;
176884f8075072eef306234f8109573067647735c111Greg Clayton}
176984f8075072eef306234f8109573067647735c111Greg Clayton
177084f8075072eef306234f8109573067647735c111Greg Clayton
177184f8075072eef306234f8109573067647735c111Greg Claytonbool
177284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
177384f8075072eef306234f8109573067647735c111Greg Clayton(
1774b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1775462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
177684f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1777462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
177884f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
177984f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
17801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
178184f8075072eef306234f8109573067647735c111Greg Clayton)
178284f8075072eef306234f8109573067647735c111Greg Clayton{
178384f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
178484f8075072eef306234f8109573067647735c111Greg Clayton        return false;
178584f8075072eef306234f8109573067647735c111Greg Clayton
1786b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
178784f8075072eef306234f8109573067647735c111Greg Clayton
1788b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
178984f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
179084f8075072eef306234f8109573067647735c111Greg Clayton
179184f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
179284f8075072eef306234f8109573067647735c111Greg Clayton
1793d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
179484f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
179584f8075072eef306234f8109573067647735c111Greg Clayton    {
1796d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
179784f8075072eef306234f8109573067647735c111Greg Clayton
179884f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
179984f8075072eef306234f8109573067647735c111Greg Clayton        {
180084f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
180184f8075072eef306234f8109573067647735c111Greg Clayton
180284f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
180384f8075072eef306234f8109573067647735c111Greg Clayton            {
180484f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
180584f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
180684f8075072eef306234f8109573067647735c111Greg Clayton                {
1807b01000fd063629facd45044f137446fb748ee179Greg Clayton                    APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1808b01000fd063629facd45044f137446fb748ee179Greg Clayton                    bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
180984f8075072eef306234f8109573067647735c111Greg Clayton                }
181084f8075072eef306234f8109573067647735c111Greg Clayton
1811b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
18129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
18139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
1814279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                            SourceLocation(),
18159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
18169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
18179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
18189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
18199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
18201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
18219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
18239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
18249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
18259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
18269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
182784f8075072eef306234f8109573067647735c111Greg Clayton            }
182884f8075072eef306234f8109573067647735c111Greg Clayton        }
182984f8075072eef306234f8109573067647735c111Greg Clayton    }
183084f8075072eef306234f8109573067647735c111Greg Clayton    return false;
183184f8075072eef306234f8109573067647735c111Greg Clayton}
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18349488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1835462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
18369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
18379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
18389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1839d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
18409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
18419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1842d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
18439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
18459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
18469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
18479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
18489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
18499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18509488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
18519488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
18529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
18539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
18549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
18559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
18569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
18579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
18599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
18609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
18619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
18629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
18639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
18651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1866462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
18671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
18681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1869b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1870462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
18711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1872462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
18731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
18741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
18751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
18761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
18771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1879b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
18801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1881b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
18821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
18831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
18851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1886d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *class_type = class_qual_type.getTypePtr();
18871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
18881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1890d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
18911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
18931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
18961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
18981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
19011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
19021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
19051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
19061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
19081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1909ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
19101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1911ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1912ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1913ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1914ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
19151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1916ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1918ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
19196bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        bool has_arg = (start[len] == ':');
19206bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
1921ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
19221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
19236bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
19246bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton            len += 1;
19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
19261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
19301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1931b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
19331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
1937d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *method_type(method_qual_type.getTypePtr());
19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1942d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1955b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
19561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
19581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
19591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
19601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
19631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
19641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
19651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
19661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
19671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
19681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
19711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
19741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
19751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
19761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
19781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
1979b01000fd063629facd45044f137446fb748ee179Greg Clayton            params.push_back (ParmVarDecl::Create (*ast,
19801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
19811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
1982279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                   SourceLocation(),
19831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
19841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
19851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
19861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
19871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
19881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
19891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
19901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1991b01000fd063629facd45044f137446fb748ee179Greg Clayton        objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
19921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
19939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
19951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
19981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
19991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
20001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
2001bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t
2002f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo
2003f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton(
2004f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type,
2005b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::ASTContext *ast,
2006f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t *pointee_or_element_clang_type
2007f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton)
2008bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
2009bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type == NULL)
2010f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return 0;
2011f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2012f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type)
2013f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        *pointee_or_element_clang_type = NULL;
2014bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2015bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2016bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2017bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2018bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    switch (type_class)
2019bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
202004325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
202104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
202204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
202304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
202404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
2025b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (ast && pointee_or_element_clang_type)
2026b01000fd063629facd45044f137446fb748ee179Greg Clayton                *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
202704325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
2028f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2029f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        default:
2030f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
203104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
203204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return eTypeIsBuiltIn | eTypeHasValue;
2033f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2034f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::BlockPointer:
2035f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2036f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2037f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2038f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2039e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                          return eTypeIsBuiltIn | eTypeHasValue;
2040f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2041f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ConstantArray:
2042f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::DependentSizedArray:
2043f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::IncompleteArray:
2044f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::VariableArray:
2045f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2046f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2047f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsArray;
2048f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2049bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentName:                    return 0;
2050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
2051bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
2052bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Decltype:                         return 0;
2053f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2054f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Enum:
2055f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2056f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2057f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsEnumeration | eTypeHasValue;
2058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2059bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Elaborated:                       return 0;
2060bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
2061bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
2062bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
2063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::InjectedClassName:                return 0;
2064f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2065f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2066f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2067f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2068f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2069f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2070f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2071bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
2072f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2073f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ObjCObjectPointer:
2074f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2075f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2076f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2077f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2078bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2079bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2080f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2081f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Pointer:
2082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2086bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Record:
2087bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (qual_type->getAsCXXRecordDecl())
2088bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2089bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        else
2090bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsStructUnion;
2091bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        break;
2092bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
2093bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
2094bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
2095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2096f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Typedef:
20979e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2098b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                  ast,
2099f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  pointee_or_element_clang_type);
2100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2101bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOfExpr:                       return 0;
2102bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOf:                           return 0;
2103bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::UnresolvedUsing:                  return 0;
2104bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
2105bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    default:                                            return 0;
2106bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
2107bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return 0;
2108bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
2109bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
21109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2114462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
212203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
21251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
21261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
21271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
21281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
21291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
21309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
21319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
21359e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
2145b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2147b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
2151b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
21529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
21539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2155960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
2156960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
2157960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::BuiltinType::ObjCId:    // child is Class
2159960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
2160960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
2161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2162960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2163960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
2164960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2165960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2166960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
2167c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2168e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex: return 0;
2169c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
21701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
21717a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
22139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
22147a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
22159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
2216d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
22179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
22189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
22209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
22219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
22239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
22249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
22269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
22279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
22289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
22299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
22309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
22319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
22329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
22339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
22349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
22359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
22369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
22389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
22399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
22409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
22419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
22429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
2244960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2245d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
2246960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
2247b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2248b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2249960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
2250960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
2251960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
2252960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
2253960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
2254960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
2255960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2256960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
22579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2264d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2265c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            QualType pointee_type (pointer_type->getPointeeType());
2266b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2267b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
22689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
2270c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2271c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We have a pointer to a pointee type that claims it has no children.
2272c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We will want to look at
2273c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2274c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2280f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2281f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2282f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
2283d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2284f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
2285b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2286b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2287f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                             omit_empty_base_classes);
2288f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            // If this type points to a simple type, then it has 1 child
2289f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (num_pointee_children == 0)
2290f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = 1;
2291f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
2292f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = num_pointee_children;
2293f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
2294f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
2295f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2296f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
22971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
2298b01000fd063629facd45044f137446fb748ee179Greg Clayton        num_children = ClangASTContext::GetNumChildren (ast,
2299b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2300b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        omit_empty_base_classes);
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2309c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no
2310c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a
2311c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer,
2312c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type
2313c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show.
2314c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t
2315c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2316c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{
2317c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (clang_type == NULL)
2318c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        return 0;
2319c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2320c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2321c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2322c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    switch (type_class)
2323c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
23249db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    case clang::Type::Builtin:
23259db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
23269db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        {
2327abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton        case clang::BuiltinType::UnknownAny:
23289db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Void:
23299db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::NullPtr:
23309db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 0;
23319db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Bool:
23329db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_U:
23339db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UChar:
2334ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_U:
23359db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char16:
23369db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char32:
23379db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UShort:
23389db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt:
23399db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULong:
23409db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULongLong:
23419db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt128:
23429db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_S:
23439db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::SChar:
2344ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_S:
23459db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Short:
23469db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int:
23479db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Long:
23489db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongLong:
23499db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int128:
23509db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Float:
23519db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Double:
23529db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongDouble:
23539db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Dependent:
23549db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Overload:
23559db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCId:
23569db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCClass:
23579db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCSel:
23580de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan        case clang::BuiltinType::BoundMember:
23599db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 1;
23609db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        }
23619db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        break;
23629db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
2363e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                  return 1;
2364c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Pointer:                  return 1;
2365c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
2366c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::LValueReference:          return 1;
2367c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::RValueReference:          return 1;
2368c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::MemberPointer:            return 0;
2369c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ConstantArray:            return 0;
2370c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::IncompleteArray:          return 0;
2371c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::VariableArray:            return 0;
2372c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedArray:      return 0;
2373c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedExtVector:  return 0;
2374c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Vector:                   return 0;
2375c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ExtVector:                return 0;
2376c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
2377c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
2378c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::UnresolvedUsing:          return 0;
2379c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Paren:                    return 0;
2380c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2381c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOfExpr:               return 0;
2382c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOf:                   return 0;
2383c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Decltype:                 return 0;
2384c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Record:                   return 0;
2385c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Enum:                     return 1;
2386c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Elaborated:               return 1;
2387c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateTypeParm:         return 1;
2388c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::SubstTemplateTypeParm:    return 1;
2389c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateSpecialization:   return 1;
2390c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::InjectedClassName:        return 0;
2391c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentName:            return 1;
2392c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return 1;
2393c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObject:               return 0;
2394c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCInterface:            return 0;
2395c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObjectPointer:        return 1;
2396c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    default:
2397c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        break;
2398c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2399c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    return 0;
2400c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton}
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2402462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2406462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2414bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
241500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
241600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
2431bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_bitfield_bit_offset,
243200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_base_class,
243300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_deref_of_parent);
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2437462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
2440b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2442462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2450bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
245100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
245200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2458b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
2463bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        child_is_base_class = false;
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
246503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
246603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2468960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
2469960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2470960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
2471960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
2472960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
247304325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_name = "isa";
2474b01000fd063629facd45044f137446fb748ee179Greg Clayton                child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
2475b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
2476960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2477960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
2478960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
2479960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
2480960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2481960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
24821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
24837a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
2488b01000fd063629facd45044f137446fb748ee179Greg Clayton                const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
2517a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
2519a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2528b01000fd063629facd45044f137446fb748ee179Greg Clayton                            uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25309994a0bcfe1790b320f6a9cf51c8d5ac9c4efdbdJim Ingham                            // Base classes bit sizes should be a multiple of 8 bits in size
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
2533bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            child_is_base_class = true;
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
2554b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
255554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
2562b01000fd063629facd45044f137446fb748ee179Greg Clayton                        if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
25729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
25737a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
25749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2575d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
25769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
25779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
25789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
25799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
25809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
25819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
25839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
25849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2585b01000fd063629facd45044f137446fb748ee179Greg Clayton                        const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
25869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
25879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
25889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
25899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
25909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2591b01000fd063629facd45044f137446fb748ee179Greg Clayton                                if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
25929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
25939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
25949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
2595b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
25969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
25999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2600b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
26019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2603960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
2604bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                        child_is_base_class = true;
26059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
26079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
26089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
26109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
26119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
26129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
26139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
26149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2615960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2616960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
26179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
26199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
26209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
26219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
26239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
26249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
26259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
26269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
26279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
26299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
26319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2632b01000fd063629facd45044f137446fb748ee179Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
26339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
26359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
2637960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                    bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
26389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_offset = bit_offset / 8;
26399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
26419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
26429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
26439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
26449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
26459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
26469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
26479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
26489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
26499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
26519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2652d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2653960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2654960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2655960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2656960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
265700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
265800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
2659b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetChildClangTypeAtIndex (ast,
2660960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2661960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2662960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2663960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2664960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
2665960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2666960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2667960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2668960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2669bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
267000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
267100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2672960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2673960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2674960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
267500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
2676960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2677960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2678960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2679960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2682960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2684960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2685b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2686960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2687960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2688960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2689960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2690960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2691960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
26929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
26939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
26949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2702b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (GetCompleteQualType (ast, array->getElementType()))
2703b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
2704b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2706b01000fd063629facd45044f137446fb748ee179Greg Clayton                        char element_name[64];
2707b01000fd063629facd45044f137446fb748ee179Greg Clayton                        ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2709b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_name.assign(element_name);
2710b01000fd063629facd45044f137446fb748ee179Greg Clayton                        assert(field_type_info.first % 8 == 0);
2711b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_size = field_type_info.first / 8;
2712b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_offset = idx * child_byte_size;
2713b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return array->getElementType().getAsOpaquePtr();
2714b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
2721d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
27239db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
27249db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                // Don't dereference "void *" pointers
27259db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                if (pointee_type->isVoidType())
27269db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                    return NULL;
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
273000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
273100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
2732b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetChildClangTypeAtIndex (ast,
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
2742bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
274300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
274400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
274800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
274900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
2759b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::LValueReference:
2770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::RValueReference:
2771f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            {
2772d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
2773f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                QualType pointee_type(reference_type->getPointeeType());
2774f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2775f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
277700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
277800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
2779b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetChildClangTypeAtIndex (ast,
2780f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     parent_name,
2781f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     pointee_clang_type,
2782f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     idx,
2783f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     transparent_pointers,
2784f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     omit_empty_base_classes,
2785f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_name,
2786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_size,
2787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_offset,
2788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_size,
2789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_offset,
279000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
279100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                else
2794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (parent_name)
2796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name.assign(1, '&');
2798f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name += parent_name;
2799f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2800f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2801f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer to an simple type
2802f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (idx == 0)
2803f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2804b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2805f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        assert(clang_type_info.first % 8 == 0);
2806f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_size = clang_type_info.first / 8;
2807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_offset = 0;
2808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        return pointee_type.getAsOpaquePtr();
2809f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2810f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2811f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            }
2812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2813f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
28141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
2815b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetChildClangTypeAtIndex (ast,
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
28179e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                             cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
2825bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_bitfield_bit_offset,
282600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_base_class,
282700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_deref_of_parent);
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2834f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2840b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3014b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3015462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
302403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
302503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
30287a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
3061b01000fd063629facd45044f137446fb748ee179Greg Clayton                    IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name));
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
31169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
31177a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
3120d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
31219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
31229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
31239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
31249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
31259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
31269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
31289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
31299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
31309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
31319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3132823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
31339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
31349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
31359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
31379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
31389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
31399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
31409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
31419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
31439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
31449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
31459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
31469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
31489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
31499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
31509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
31519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
31529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
31539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3154b01000fd063629facd45044f137446fb748ee179Greg Clayton                            if (GetIndexOfChildMemberWithName (ast,
3155b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                               ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
31569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
31579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
31589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
31599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
31609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
31619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
31629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
31639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
31649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
31669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
31679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
31689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
31699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
31709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
31719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
31729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
31739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
31749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
31769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3177b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildMemberWithName (ast,
31789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
31799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
31809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
31819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
31829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
31839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
31849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3193b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3214b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
32211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
32221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3224d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3229b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3240d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3245b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3262b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3273b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildMemberWithName (ast,
32749e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                                  cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
327724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3294b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3295462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
33039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
330403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
33059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
330603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
33097a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
33529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
33537a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
33549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
33559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
3356d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
33579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
33589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
33599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
33609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
33619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
33629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
33649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
33659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
33669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
33679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
33699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
33709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
33719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
33739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
33749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
33759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
33769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
33779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
33799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
33809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
33819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
33839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
33849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
33859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
33869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
33879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
33889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
33899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
33909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
33919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
33939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3394b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildWithName (ast,
33959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
33969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
33979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
33989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
33999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
34009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
34011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3408b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3429b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
34361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
34371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3439d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3444b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3454d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3459b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
346724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
346824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
346924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
347124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
347224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
347324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
347424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3475b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3486b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildWithName (ast,
34879e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
349124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
349524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
349924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3501462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
350224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
350324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
350524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
3506d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *clang_type = tag_qual_type.getTypePtr();
350724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3509d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const TagType *tag_type = dyn_cast<TagType>(clang_type);
351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
3528462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
353403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
353503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
35389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
35399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
35409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
35419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
3542279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentSizedArray:      break;
35439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
3544279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentSizedExtVector:  break;
35459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
35469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
35479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
35489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
35499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
35509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
35519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
35529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
35539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
35549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
35559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
35569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
35579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
35589e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
35599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
35609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
35619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
35629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
35639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
35649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
3565279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentTemplateSpecialization:  break;
3566279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::TemplateTypeParm:         break;
3567279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::SubstTemplateTypeParm:    break;
3568279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::SubstTemplateTypeParmPack:break;
3569279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::PackExpansion:            break;
3570279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::UnresolvedUsing:          break;
3571279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Paren:                    break;
3572279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Elaborated:               break;
3573279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Attributed:               break;
3574279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::Auto:                     break;
3575279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::InjectedClassName:        break;
3576279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    case clang::Type::DependentName:            break;
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3591b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
3593b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
3594279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name));
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
3603462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3607b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3608b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3612b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3613b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3615279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                        SourceLocation(),
3616b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        DeclarationName (&ast->Idents.get(name)),
361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3625b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3626b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3628279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                        SourceLocation(),
362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3640462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3641b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast,
3642462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
3643462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
36442ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
36452ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
36462ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3648b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
3654ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    FunctionProtoType::ExtProtoInfo proto_info;
3655ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Variadic = is_variadic;
3656279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    proto_info.ExceptionSpecType = EST_None;
3657ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.TypeQuals = type_quals;
3658279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    proto_info.RefQualifier = RQ_None;
3659ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.NumExceptions = 0;
3660ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Exceptions = NULL;
3661ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan
3662b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
366353d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
3665ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                        proto_info).getAsOpaquePtr();    // NoReturn);
366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3669462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3671b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3672b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
3673b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ParmVarDecl::Create(*ast,
3674b01000fd063629facd45044f137446fb748ee179Greg Clayton                                ast->getTranslationUnitDecl(),
367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
3676279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                SourceLocation(),
3677b01000fd063629facd45044f137446fb748ee179Greg Clayton                                name && name[0] ? &ast->Idents.get(name) : NULL,
36782ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
368524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
368624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
368724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
368824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
368924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
369024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
369424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3695462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3696462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
369824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
369924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3700b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3701b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
3703b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
370624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3715462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
371824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3720d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *t = qual_type.getTypePtr();
372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3723d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan            const TagType *tag_type = dyn_cast<TagType>(t);
372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
372724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
372824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
372924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
373024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
373124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
373224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
373424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
373524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
373624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3739462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
374455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
374555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
374655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
374755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
374955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
375055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
375155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
375255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
375355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3754d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
375504325065a00f646527db85e9bc751da29ac53b23Sean Callanan
375604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        if (objc_class_type)
375704325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
375804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
375904325065a00f646527db85e9bc751da29ac53b23Sean Callanan
376004325065a00f646527db85e9bc751da29ac53b23Sean Callanan            class_interface_decl->setForwardDecl(false);
376104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
376204325065a00f646527db85e9bc751da29ac53b23Sean Callanan
376355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
376455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
376555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
376655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
376755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
376855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
376955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
377155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
377255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
377355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
377455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
377555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3776b01000fd063629facd45044f137446fb748ee179Greg Clayton                ASTContext *ast = getASTContext();
377748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
377848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                QualType promotion_qual_type;
377948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // If the enum integer type is less than an integer in bit width,
378048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // then we must promote it to an integer size.
3781b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
378248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                {
378348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
3784b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->IntTy;
378548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    else
3786b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->UnsignedIntTy;
378748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                }
378848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                else
378948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
379048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
379148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
379255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
379324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3802462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
38030d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType
38040d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton(
38050d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const char *name,
38060d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    DeclContext *decl_ctx,
38070d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const Declaration &decl,
38080d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    clang_type_t integer_qual_type
38090d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton)
381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
3813b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3814b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
381548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
381648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    // TODO: ask about these...
381748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsScoped = false;
381848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsFixed = false;
381948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
3820b01000fd063629facd45044f137446fb748ee179Greg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast,
38210d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                                            decl_ctx,
382248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
382348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
3824279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                            name && name[0] ? &ast->Idents.get(name) : NULL,
38259e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            NULL,
38269e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScoped
38279e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScopedUsingClassTag
38289e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false); // IsFixed
3829864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3830864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3832e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3833e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3834e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
3835864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3836864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
3837864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3838b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
3839e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
384024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
384224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3843462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3844462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3845462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3846462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3847462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3848d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan    const clang::Type *clang_type = enum_qual_type.getTypePtr();
3849462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3850462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3851462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3852462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3853462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3854462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3855462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3856462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3857462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3858462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3859462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3860462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
386124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
386224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3864462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3865462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
386924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
387424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
387524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
3876b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3879b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
388124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3883d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const clang::Type *clang_type = enum_qual_type.getTypePtr();
388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
388624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
388724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
389024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
3893b01000fd063629facd45044f137446fb748ee179Greg Clayton                    EnumConstantDecl::Create (*ast,
3894b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_type->getDecl(),
3895b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              SourceLocation(),
3896b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              name ? &identifier_table->get(name) : NULL,    // Identifier
3897b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              QualType::getFromOpaquePtr(enumerator_clang_type),
3898b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              NULL,
3899b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_llvm_apsint);
3900b01000fd063629facd45044f137446fb748ee179Greg Clayton
390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
390324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3914462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3915462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3917427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return CreatePointerType (getASTContext(), clang_type);
3918427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t
3921427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
3922427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
3923427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (ast && clang_type)
39247b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
39257b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
39267b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
392703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
392803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
39297b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
39307b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
39317b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
3932427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
39337b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
39347b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
3935427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getPointerType(qual_type).getAsOpaquePtr();
39367b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
39377b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
393824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3941462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
39426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
39436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
39466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
394724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
394924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3950462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
39516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
39526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
39556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3959462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3960462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
3961fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
3962fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
3963fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
3964fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
3965fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
3966fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
3967fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
3968bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t
396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
397024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3971b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3972b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTypeSize(ast->VoidPtrTy);
397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3976462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
398203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
398303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
398504325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
398604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
398704325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
398804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        default:
398904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            break;
399004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
399104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
399204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return true;
399304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
399404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return false;
39951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
399724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
399824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
40031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
40071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
400824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
400924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
401024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
40111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
401424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
40151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
40191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
40209e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
402424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
402624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4028462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
402924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
403224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
403624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
403824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
403924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
404024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4048462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
404924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
405024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
405124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
405224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
405303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
405403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
405604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::Type::Builtin:
405704325065a00f646527db85e9bc751da29ac53b23Sean Callanan            switch (cast<clang::BuiltinType>(qual_type)->getKind())
405804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            {
405904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            default:
406004325065a00f646527db85e9bc751da29ac53b23Sean Callanan                break;
406104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCId:
406204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCClass:
406304325065a00f646527db85e9bc751da29ac53b23Sean Callanan                return true;
406404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            }
406504325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return false;
40661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
407524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
407624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
407724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
407924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
408024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
408124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
40839e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
408624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
408724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
408824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
409124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4092462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
409324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
409424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
409524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
409624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
409724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
409824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
409924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
410024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
410124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
410224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
410324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
410424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
410524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
410624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
410724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
410824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
410924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
411024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
411124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
411224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
411324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
411424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
411524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
411624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
411724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
411824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
411924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
412024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
412124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
412224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
412324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
412424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
412524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
412624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
412724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
412824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
412924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4130bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4131bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool
4132bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
4133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
4134bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type)
4135bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
4136bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4137bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4138bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (cxx_record_decl)
4140bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
4141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
4142bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return true;
4143bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
4144bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
4145bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    class_name.clear();
4146bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return false;
4147bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
4148bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4149bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
41501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4151462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
41521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
41531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
41541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
41551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
41561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
41571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
41581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
41591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
41601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
41611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
41621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4163462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
41641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
41651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
41661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
41671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
41681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
41691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
41701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
41711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
41721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
41731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
41741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
4175f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool
4176f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type)
4177f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4178f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4179f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return QualType::getFromOpaquePtr(clang_type)->isCharType();
4180f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return false;
4181f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
418224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
418324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4184462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
418524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4186f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t pointee_or_element_clang_type = NULL;
4187f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
4188f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4189f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type == NULL)
4190f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return false;
4191f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4192f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
419324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4194f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
4195f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4196f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
419724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4198f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4199f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (type_flags.Test (eTypeIsArray))
420024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4201f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We know the size of the array and it could be a C string
4202f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // since it is an array of characters
4203f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4204f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
420524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
4206f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
420724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4208f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = 0;
4209f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
421024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
421124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
421224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
421324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
421424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
421524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
421624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
421724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4218462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
421903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
422003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
422103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
422203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
422303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
422403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
422503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
422603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
422703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
422803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
422903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
4230279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        default:
4231279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            break;
423203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
42339e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
423403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
423503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
423603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
423703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
4238d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
423903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
424003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
424103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
424203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
424303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
424403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
424503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
424603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
424703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
4248f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t
4249f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type)
4250f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4251f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4252f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
4253d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan        const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
4254f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (array)
4255f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return array->getSize().getLimitedValue();
4256f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
4257f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return 0;
4258f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
425903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
426003e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
4261462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
426224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
426324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
426424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
426524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
426624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
426724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
426803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
426903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
427024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4271279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan    default:
4272279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan        break;
42731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
427424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
427524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
427624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
4277381f968161e2274c55706ead0baed444a26b5092Greg Clayton            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
427824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
42791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
428024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
428224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
428324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
428424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
42851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
428624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
428724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
428824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
428924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
42905aad3f5581aec9ee62277d92b11cba7abf837dbdGreg Clayton        return true;
42911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
429224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
429324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
429424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
429524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
429624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
429724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
429824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
429924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
430024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
430124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
430224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
430324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4304462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4305462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
430624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
430724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
430824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4310b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
4312b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
431324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
431424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
4315b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
4316b01000fd063629facd45044f137446fb748ee179Greg Clayton        TypedefDecl *decl = TypedefDecl::Create (*ast,
4317b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 decl_ctx,
4318b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 SourceLocation(),
4319279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                 SourceLocation(),
4320b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 name ? &identifier_table->get(name) : NULL, // Identifier
4321b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 ast->CreateTypeSourceInfo(qual_type));
4322864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
4323864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        decl->setAccess(AS_public); // TODO respect proper access specifier
432424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
432524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
4326b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTypedefType (decl).getAsOpaquePtr();
432724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
433124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
433224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
4333462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
433524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4337462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type));
433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4339462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43420de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan        const TypedefNameDecl *typedef_decl = typedef_type->getDecl();
434324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
434724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
434924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
435124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
435224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
4360b01000fd063629facd45044f137446fb748ee179Greg 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)
436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
437324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
437424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
437524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
437624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
437724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
437824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
438024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
438124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
438524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
438624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
438824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
438924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
439024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
439124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
439224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
439324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
439424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
4395b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
439624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
439724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
439824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
440224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
440324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
440624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
4409b01000fd063629facd45044f137446fb748ee179Greg Clayton            APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
441024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4411b01000fd063629facd45044f137446fb748ee179Greg Clayton            const uint64_t bit_size = ast->getTypeSize (qual_type);
441224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
441424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
441524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
441824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
442224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
442424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
442524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
442624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
443024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
443124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4432a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4433a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
4434462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
4435a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
4436a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
4437a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4438a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4439a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4440a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
4441a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
4442b01000fd063629facd45044f137446fb748ee179Greg Clayton
4443b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4444b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
4445b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4446b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
4447b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
4448b01000fd063629facd45044f137446fb748ee179Greg Clayton
44497a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton    return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
4450b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4451b01000fd063629facd45044f137446fb748ee179Greg Clayton
4452b01000fd063629facd45044f137446fb748ee179Greg Clayton
4453b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4454b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type)
4455b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4456b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
4457b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4458b01000fd063629facd45044f137446fb748ee179Greg Clayton
4459