ClangASTContext.cpp revision bdcb6abaa287df2c5f312c51d993c1d0b0cb120c
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
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
58f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h"
59839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h"
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
62f05633b35544b5d095feb05680c8728be087e441Eli Friedman
63585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb;
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68b01000fd063629facd45044f137446fb748ee179Greg Clayton
69b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic bool
70b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
71b01000fd063629facd45044f137446fb748ee179Greg Clayton{
72b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
73b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
74b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
75b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
76b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
77b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
78b01000fd063629facd45044f137446fb748ee179Greg Clayton            clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
79b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (tag_type)
80b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
81b01000fd063629facd45044f137446fb748ee179Greg Clayton                clang::TagDecl *tag_decl = tag_type->getDecl();
82b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (tag_decl)
83b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
84b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (tag_decl->getDefinition())
85b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return true;
86b01000fd063629facd45044f137446fb748ee179Greg Clayton
87b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (tag_decl->hasExternalLexicalStorage())
88b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
89b01000fd063629facd45044f137446fb748ee179Greg Clayton                        ExternalASTSource *external_ast_source = ast->getExternalSource();
90b01000fd063629facd45044f137446fb748ee179Greg Clayton                        if (external_ast_source)
91b01000fd063629facd45044f137446fb748ee179Greg Clayton                        {
92b01000fd063629facd45044f137446fb748ee179Greg Clayton                            external_ast_source->CompleteType(tag_decl);
93b01000fd063629facd45044f137446fb748ee179Greg Clayton                            return !tag_type->isIncompleteType();
94b01000fd063629facd45044f137446fb748ee179Greg Clayton                        }
95b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
96b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return false;
97b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
98b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
99b01000fd063629facd45044f137446fb748ee179Greg Clayton
100b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
101b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
102b01000fd063629facd45044f137446fb748ee179Greg Clayton
103b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
104b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
105b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
106b01000fd063629facd45044f137446fb748ee179Greg Clayton            clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
107b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
108b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
109b01000fd063629facd45044f137446fb748ee179Greg Clayton                clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
110b01000fd063629facd45044f137446fb748ee179Greg Clayton                // We currently can't complete objective C types through the newly added ASTContext
111b01000fd063629facd45044f137446fb748ee179Greg Clayton                // because it only supports TagDecl objects right now...
112b01000fd063629facd45044f137446fb748ee179Greg Clayton                bool is_forward_decl = class_interface_decl->isForwardDecl();
113b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
114b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
115b01000fd063629facd45044f137446fb748ee179Greg Clayton                    ExternalASTSource *external_ast_source = ast->getExternalSource();
116b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (external_ast_source)
117b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
118b01000fd063629facd45044f137446fb748ee179Greg Clayton                        external_ast_source->CompleteType (class_interface_decl);
119b01000fd063629facd45044f137446fb748ee179Greg Clayton                        is_forward_decl = class_interface_decl->isForwardDecl();
120b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
1217a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    return is_forward_decl == false;
122b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1237a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                return true;
124b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
125b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
126b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
127b01000fd063629facd45044f137446fb748ee179Greg Clayton
128b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
129b01000fd063629facd45044f137446fb748ee179Greg Clayton        return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
130b01000fd063629facd45044f137446fb748ee179Greg Clayton
131b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
132b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
133b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
134b01000fd063629facd45044f137446fb748ee179Greg Clayton
135b01000fd063629facd45044f137446fb748ee179Greg Clayton    return true;
136b01000fd063629facd45044f137446fb748ee179Greg Clayton}
137b01000fd063629facd45044f137446fb748ee179Greg Clayton
138b01000fd063629facd45044f137446fb748ee179Greg Clayton
13984f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
140585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access)
14184f8075072eef306234f8109573067647735c111Greg Clayton{
14284f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
14384f8075072eef306234f8109573067647735c111Greg Clayton    {
144585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
145585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
146585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
147585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
148585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
14984f8075072eef306234f8109573067647735c111Greg Clayton    }
15084f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
15184f8075072eef306234f8109573067647735c111Greg Clayton}
15284f8075072eef306234f8109573067647735c111Greg Clayton
15384f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
154585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
15584f8075072eef306234f8109573067647735c111Greg Clayton{
15684f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
15784f8075072eef306234f8109573067647735c111Greg Clayton    {
158585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
159585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return ObjCIvarDecl::None;
160585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return ObjCIvarDecl::Public;
161585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return ObjCIvarDecl::Private;
162585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return ObjCIvarDecl::Protected;
163585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPackage:   return ObjCIvarDecl::Package;
16484f8075072eef306234f8109573067647735c111Greg Clayton    }
16584f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
16684f8075072eef306234f8109573067647735c111Greg Clayton}
16784f8075072eef306234f8109573067647735c111Greg Clayton
16884f8075072eef306234f8109573067647735c111Greg Clayton
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
173e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
181e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
183e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
184e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
185e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
186e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
195e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
196e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
197b01000fd063629facd45044f137446fb748ee179Greg Clayton                assert (!"Invalid input kind!");
198e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
201e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
202e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
203e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
204e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
205e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
208e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
209e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
210e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
211e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
2598950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan        Opts.setVisibilityMode(DefaultVisibility);
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
333e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
334b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) :
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
336b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap(),
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
344b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_builtins_ap(),
345b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_tag_decl (NULL),
346b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_objc_decl (NULL),
347b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_baton (NULL)
348b01000fd063629facd45044f137446fb748ee179Greg Clayton
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
367b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
374b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
398b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
399b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource ()
400b01000fd063629facd45044f137446fb748ee179Greg Clayton{
401b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
402b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
403b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getExternalSource () != NULL;
404b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
405b01000fd063629facd45044f137446fb748ee179Greg Clayton}
406b01000fd063629facd45044f137446fb748ee179Greg Clayton
407b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
408b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
409b01000fd063629facd45044f137446fb748ee179Greg Clayton{
410b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
411b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
412b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
413b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (ast_source_ap);
414b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
415b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
416b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
417b01000fd063629facd45044f137446fb748ee179Greg Clayton}
418b01000fd063629facd45044f137446fb748ee179Greg Clayton
419b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
420b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource ()
421b01000fd063629facd45044f137446fb748ee179Greg Clayton{
422b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
423b01000fd063629facd45044f137446fb748ee179Greg Clayton
424b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
425b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
426b01000fd063629facd45044f137446fb748ee179Greg Clayton        llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
427b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (empty_ast_source_ap);
428b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
429b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
430b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
431b01000fd063629facd45044f137446fb748ee179Greg Clayton}
432b01000fd063629facd45044f137446fb748ee179Greg Clayton
433b01000fd063629facd45044f137446fb748ee179Greg Clayton
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
438b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get() == NULL)
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
440b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
441b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSourceManager(),
442b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getTargetInfo(),
443b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getIdentifierTable(),
444b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSelectorTable(),
445b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getBuiltinContext(),
446b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       0));
447887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
448b01000fd063629facd45044f137446fb748ee179Greg Clayton        if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
449b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
450b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
451b01000fd063629facd45044f137446fb748ee179Greg Clayton            //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
452b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
453b01000fd063629facd45044f137446fb748ee179Greg Clayton
454b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
456b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast_ap.get();
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
481e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
482e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4958a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
4968a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
4978a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
4988a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
49922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    {
50022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        clang::FileSystemOptions file_system_options;
50122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
50222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    }
5038a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
5048a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
5058a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
5061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
51022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
518eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    {
519eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
520eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
521eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    }
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
525887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient
526887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
527887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic:
528887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    NullDiagnosticClient ()
529887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
530887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
531887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
532887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
533887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
534887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
535887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        if (m_log)
536887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        {
537887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            llvm::SmallVectorImpl<char> diag_str(10);
538887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            info.FormatDiagnostic(diag_str);
539887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            diag_str.push_back('\0');
540887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
541887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        }
542887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
543887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate:
544887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    LogSP m_log;
545887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan};
546887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
547887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient *
548887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient()
549887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
550887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    if (m_diagnostic_client_ap.get() == NULL)
551887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_diagnostic_client_ap.reset(new NullDiagnosticClient);
552887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
553887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    return m_diagnostic_client_ap.get();
554887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}
555887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
581b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
583b01000fd063629facd45044f137446fb748ee179Greg Clayton    uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
589462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
590585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
592b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
594b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
596b01000fd063629facd45044f137446fb748ee179Greg Clayton    return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
599462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
600b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
602b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
607585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
608b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
609b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->VoidPtrTy.getAsOpaquePtr();
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
612585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
613b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
614b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedCharTy.getAsOpaquePtr();
615b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
616b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedShortTy.getAsOpaquePtr();
617b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
618b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedIntTy.getAsOpaquePtr();
619b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
620b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongTy.getAsOpaquePtr();
621b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
622b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedLongLongTy.getAsOpaquePtr();
623b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
624b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->UnsignedInt128Ty.getAsOpaquePtr();
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
627585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
628b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
629b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->CharTy.getAsOpaquePtr();
630b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
631b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->ShortTy.getAsOpaquePtr();
632b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
633b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->IntTy.getAsOpaquePtr();
634b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
635b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongTy.getAsOpaquePtr();
636b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
637b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongLongTy.getAsOpaquePtr();
638b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
639b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->Int128Ty.getAsOpaquePtr();
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
642585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
643b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
644b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->FloatTy.getAsOpaquePtr();
645b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
646b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->DoubleTy.getAsOpaquePtr();
647b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
648b01000fd063629facd45044f137446fb748ee179Greg Clayton            return ast->LongDoubleTy.getAsOpaquePtr();
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
651585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
659462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
662b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
665b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
666b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
674b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
675b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->VoidPtrTy.getAsOpaquePtr();
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
679b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
680b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->BoolTy.getAsOpaquePtr();
681b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
682b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
683b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
684b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
685b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
686b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
689e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        case DW_ATE_lo_user:
690e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            // This has been seen to mean DW_AT_complex_integer
691e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            if (strcmp(type_name, "complex") == 0)
692e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
693e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
694b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
695e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
696e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            break;
697e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
699b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
700b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatComplexTy.getAsOpaquePtr();
701b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
702b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleComplexTy.getAsOpaquePtr();
703b01000fd063629facd45044f137446fb748ee179Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
704b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleComplexTy.getAsOpaquePtr();
705e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else
706e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
707e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
708b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
709e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
713b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
714b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->FloatTy.getAsOpaquePtr();
715b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
716b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->DoubleTy.getAsOpaquePtr();
717b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
718b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongDoubleTy.getAsOpaquePtr();
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
726b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
727b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongLongTy.getAsOpaquePtr();
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
731b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
732b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->LongTy.getAsOpaquePtr();
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
736b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
737b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->ShortTy.getAsOpaquePtr();
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7398ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
741b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
742b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->CharTy.getAsOpaquePtr();
743b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
744b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
7478ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
748b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
749b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->IntTy.getAsOpaquePtr();
750b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
751b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->Int128Ty.getAsOpaquePtr();
7528ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
7538ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (streq(type_name, "wchar_t"))
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
755b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
756b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->WCharTy.getAsOpaquePtr();
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
760b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
761b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
762b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
763b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ShortTy.getAsOpaquePtr();
764b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
765b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->IntTy.getAsOpaquePtr();
766b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
767b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongTy.getAsOpaquePtr();
768b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
769b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->LongLongTy.getAsOpaquePtr();
770b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
771b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->Int128Ty.getAsOpaquePtr();
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
779b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
780b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->SignedCharTy.getAsOpaquePtr();
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
783b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
784b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->CharTy.getAsOpaquePtr();
785b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
786b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->SignedCharTy.getAsOpaquePtr();
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7928ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
794b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
795b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongLongTy.getAsOpaquePtr();
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
7978ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
799b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
800b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedLongTy.getAsOpaquePtr();
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8028ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
804b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
805b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedShortTy.getAsOpaquePtr();
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8078ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
809b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
810b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedCharTy.getAsOpaquePtr();
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
8128ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
8138ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
814b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
815b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedIntTy.getAsOpaquePtr();
816b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
817b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return ast->UnsignedInt128Ty.getAsOpaquePtr();
8188ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
821b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
822b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
823b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
824b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedShortTy.getAsOpaquePtr();
825b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
826b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedIntTy.getAsOpaquePtr();
827b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
828b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongTy.getAsOpaquePtr();
829b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
830b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedLongLongTy.getAsOpaquePtr();
831b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
832b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedInt128Ty.getAsOpaquePtr();
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
836b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
837b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->UnsignedCharTy.getAsOpaquePtr();
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
850462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
851b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast)
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
853b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->VoidTy.getAsOpaquePtr();
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
856462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
857a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool()
858a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{
859a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan    return getASTContext()->BoolTy.getAsOpaquePtr();
860a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan}
861a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
862a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t
863960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
864960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
865c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
866960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
867960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
868462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
869960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
870960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
87104325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
872960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
873960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
874462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
875960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
876960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
877c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
878960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
879960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
880462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
891462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
897462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
898b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
900b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType void_ptr_type(ast->VoidPtrTy);
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
908462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
90922defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast,
91022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
911462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9138a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
91422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
91522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
916ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
917ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
918cf18faaf72090a68480145ca206955d792633559Sean Callanan
91922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType src (QualType::getFromOpaquePtr(clang_type));
92022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType dst (importer.Import(src));
921cf18faaf72090a68480145ca206955d792633559Sean Callanan
922cf18faaf72090a68480145ca206955d792633559Sean Callanan    return dst.getAsOpaquePtr();
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9256916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9266916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
92722defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast,
92822defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
9296916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
930887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
9318a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
93222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
93322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
934ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
935ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
9366916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
9386916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
9396916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
9408d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
941b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast,
942462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
943462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
9445510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
945b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->hasSameType(QualType::getFromOpaquePtr(type1),
9465510dddc33260a991284ef81ca343594f23262e8Sean Callanan                                    QualType::getFromOpaquePtr(type2));
9475510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
9485510dddc33260a991284ef81ca343594f23262e8Sean Callanan
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
951462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
952462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
963462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
964462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
975462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
976462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
987b01000fd063629facd45044f137446fb748ee179Greg Clayton
988b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
989b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl)
990b01000fd063629facd45044f137446fb748ee179Greg Clayton{
991b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
992b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
993b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
994b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
995b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
996b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
997b01000fd063629facd45044f137446fb748ee179Greg Clayton}
998b01000fd063629facd45044f137446fb748ee179Greg Clayton
999b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t
1000b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1001b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1002b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1003b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1004b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
1005b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get())
1006b01000fd063629facd45044f137446fb748ee179Greg Clayton        return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
1007b01000fd063629facd45044f137446fb748ee179Greg Clayton    return NULL;
1008b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1009b01000fd063629facd45044f137446fb748ee179Greg Clayton
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1012462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
1013585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1015b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1016b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
101704325065a00f646527db85e9bc751da29ac53b23Sean Callanan
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
1019b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1022585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
10239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1024306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
10259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
10269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
10279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
10289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
1034b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
1038b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                name && name[0] ? &ast->Idents.get(name) : NULL);
1039b01000fd063629facd45044f137446fb748ee179Greg Clayton
1040b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTagDeclType(decl).getAsOpaquePtr();
1041b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1042b01000fd063629facd45044f137446fb748ee179Greg Clayton
1043b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
1044b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
1045b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1046b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
1047b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
1048b01000fd063629facd45044f137446fb748ee179Greg Clayton
1049b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1050b01000fd063629facd45044f137446fb748ee179Greg Clayton
1051b01000fd063629facd45044f137446fb748ee179Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1052b01000fd063629facd45044f137446fb748ee179Greg Clayton    switch (type_class)
1053b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
1054b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Record:
1055b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1056b01000fd063629facd45044f137446fb748ee179Greg Clayton            CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
1057b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (cxx_record_decl)
1058b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1059b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_record_decl->setHasExternalLexicalStorage (has_extern);
10607a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                cxx_record_decl->setHasExternalVisibleStorage (has_extern);
1061b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1062b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1063b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1064b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1065b01000fd063629facd45044f137446fb748ee179Greg Clayton
1066b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Enum:
1067b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1068b01000fd063629facd45044f137446fb748ee179Greg Clayton            EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
1069b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (enum_decl)
1070b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1071b01000fd063629facd45044f137446fb748ee179Greg Clayton                enum_decl->setHasExternalLexicalStorage (has_extern);
10727a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                enum_decl->setHasExternalVisibleStorage (has_extern);
1073b01000fd063629facd45044f137446fb748ee179Greg Clayton                return true;
1074b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1075b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1076b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1077b01000fd063629facd45044f137446fb748ee179Greg Clayton
1078b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCObject:
1079b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::ObjCInterface:
1080b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
1081b01000fd063629facd45044f137446fb748ee179Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
1082b01000fd063629facd45044f137446fb748ee179Greg Clayton            assert (objc_class_type);
1083b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (objc_class_type)
1084b01000fd063629facd45044f137446fb748ee179Greg Clayton            {
1085b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
1086b01000fd063629facd45044f137446fb748ee179Greg Clayton
1087b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (class_interface_decl)
1088b01000fd063629facd45044f137446fb748ee179Greg Clayton                {
1089b01000fd063629facd45044f137446fb748ee179Greg Clayton                    class_interface_decl->setHasExternalLexicalStorage (has_extern);
10907a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton                    class_interface_decl->setHasExternalVisibleStorage (has_extern);
1091b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return true;
1092b01000fd063629facd45044f137446fb748ee179Greg Clayton                }
1093b01000fd063629facd45044f137446fb748ee179Greg Clayton            }
1094b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
1095b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1097b01000fd063629facd45044f137446fb748ee179Greg Clayton    case clang::Type::Typedef:
1098b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
1099b01000fd063629facd45044f137446fb748ee179Greg Clayton
1100b01000fd063629facd45044f137446fb748ee179Greg Clayton    default:
1101b01000fd063629facd45044f137446fb748ee179Greg Clayton        break;
1102b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
1103b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1106dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
1107dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
1108dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
1109dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
1110dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
1111dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1112494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator"
1113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
1114c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1115c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    const char *post_op_name = NULL;
1116c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1117494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    bool no_space = true;
1118c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
1120494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        return false;
1121494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan
1122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
1123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1124494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    if (post_op_name[0] == ' ')
1125c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    {
1126494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        post_op_name++;
1127494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        no_space = false;
1128c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    }
1129c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1130494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX
1131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH
1132dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1133dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
1134dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
1135dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
1136dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1137dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
1138dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
1139c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    default:
1140c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1141c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1142c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        break;
1143dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
1144c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1145c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1146dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
1147dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
1148dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
1149dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1151dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1152dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
1153c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1154c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1155dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
1156dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
1157dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
1158dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
1164dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1165dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1166dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
1167dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
1168dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
1169dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
1170dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1171dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1172dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1173dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
1174dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1175dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1177dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1178dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1179dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1180dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
1181dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
1182dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
1183dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1192dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
1193dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
1197dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1321b01000fd063629facd45044f137446fb748ee179Greg Clayton
1322412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
1323795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
1324795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1325b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1326462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1327412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1328462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1329412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
13301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
13311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
133230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
133330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1334412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1335795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
13363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1337974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1338795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1339b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert(ast);
1340795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1341b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
1342795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1343795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1344795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
13453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
13461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1347b01000fd063629facd45044f137446fb748ee179Greg Clayton    CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
1348795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
13491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1350412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1351795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
13521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
13531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
135430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
13553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
135630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
135790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
135890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
135990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
13605325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
136190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
13625325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
136390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
136490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
13655325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
136630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
136790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
136890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
136990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
137090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
137190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
137290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
137390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1374b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast,
137590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1376b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                     DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
137790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
13788950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                                     NULL,
137990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
138090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
138190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
1382b01000fd063629facd45044f137446fb748ee179Greg Clayton    else if (decl_name == cxx_record_decl->getDeclName())
138330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
1384b01000fd063629facd45044f137446fb748ee179Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast,
138530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
1386b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                      DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
138730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
138830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
138930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
139030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
139130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
139230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
139330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
139490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1395dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1396dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1397dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
139890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1399dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1400dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1401b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast,
140290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1403b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
140490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
140590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1406dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1407dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1408dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_inline);
1409dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1410dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1411dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1412dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1413b01000fd063629facd45044f137446fb748ee179Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast,
1414dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
1415b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                             DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1416dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1417dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1418dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1419dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_explicit);
1420dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
142190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1422dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1423dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
142490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1425b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast,
142690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1427dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
142890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
142990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
143090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
143190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
143290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline);
143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
143430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1435dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1436462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
143747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
14381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
14391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
144047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
14413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
14423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ParmVarDecl *params[num_params];
14443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
14463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
14473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
14483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1449b01000fd063629facd45044f137446fb748ee179Greg Clayton        params[param_index] = ParmVarDecl::Create (*ast,
14501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   cxx_method_decl,
14511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
14521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
14531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
14541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
14551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
14561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
14571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL);
14583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
14593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setParams (params, num_params);
14613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
14621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
14637a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton
14647a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPolymorphic()             = %i\n", cxx_record_decl->isPolymorphic());
14657a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAggregate()               = %i\n", cxx_record_decl->isAggregate());
14667a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isPOD()                     = %i\n", cxx_record_decl->isPOD());
14677a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isEmpty()                   = %i\n", cxx_record_decl->isEmpty());
14687a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->isAbstract()                = %i\n", cxx_record_decl->isAbstract());
14697a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialConstructor()     = %i\n", cxx_record_decl->hasTrivialConstructor());
14707a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
14717a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialCopyAssignment()  = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
14727a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton//    printf ("decl->hasTrivialDestructor()      = %i\n", cxx_record_decl->hasTrivialDestructor());
1473412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1474795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1475795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1476795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
147784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
147884f8075072eef306234f8109573067647735c111Greg Clayton(
1479b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1480462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
148184f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1482462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
148384f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
148484f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
148584f8075072eef306234f8109573067647735c111Greg Clayton)
148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1490b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1492b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    clang::Type *clang_type = record_qual_type.getTypePtr();
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1509b01000fd063629facd45044f137446fb748ee179Greg Clayton                APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1510b01000fd063629facd45044f137446fb748ee179Greg Clayton                bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1512b01000fd063629facd45044f137446fb748ee179Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast,
151384f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
151484f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
151584f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
151684f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
151784f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
151884f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
151984f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
152184f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
15309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
1534b01000fd063629facd45044f137446fb748ee179Greg Clayton                ClangASTContext::AddObjCClassIVar (ast,
153560a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
15401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
15419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
15429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
1556b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1561b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast == NULL || field == NULL)
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
1570b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1607b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1609b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type)
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1611b01000fd063629facd45044f137446fb748ee179Greg Clayton        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1612b01000fd063629facd45044f137446fb748ee179Greg Clayton
1613b01000fd063629facd45044f137446fb748ee179Greg Clayton        RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
1614b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (record_type)
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1616b01000fd063629facd45044f137446fb748ee179Greg Clayton            RecordDecl *record_decl = record_type->getDecl();
1617b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (record_decl)
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1619b01000fd063629facd45044f137446fb748ee179Greg Clayton                uint32_t field_idx;
1620b01000fd063629facd45044f137446fb748ee179Greg Clayton                RecordDecl::field_iterator field, field_end;
1621b01000fd063629facd45044f137446fb748ee179Greg Clayton                for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
1622b01000fd063629facd45044f137446fb748ee179Greg Clayton                     field != field_end;
1623b01000fd063629facd45044f137446fb748ee179Greg Clayton                     ++field, ++field_idx)
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
1625b01000fd063629facd45044f137446fb748ee179Greg Clayton                    // If no accessibility was assigned, assign the correct one
1626b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
1627b01000fd063629facd45044f137446fb748ee179Greg Clayton                        field->setAccess ((AccessSpecifier)default_accessibility);
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1637462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
16406e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
16416e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
16426e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
16436e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
1644ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
1645ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                     SourceLocation());
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1649e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1650e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1651e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1652e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1653e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1654e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1655e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1656e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1657e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1658e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1660462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1664b01000fd063629facd45044f137446fb748ee179Greg Clayton        CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
1665b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (cxx_record_decl)
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1667b01000fd063629facd45044f137446fb748ee179Greg Clayton            cxx_record_decl->setBases(base_classes, num_base_classes);
1668b01000fd063629facd45044f137446fb748ee179Greg Clayton            return true;
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
167384f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
167484f8075072eef306234f8109573067647735c111Greg Clayton
1675462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
167684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
167784f8075072eef306234f8109573067647735c111Greg Clayton(
167884f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
167984f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
168084f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
168184f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
168284f8075072eef306234f8109573067647735c111Greg Clayton)
168384f8075072eef306234f8109573067647735c111Greg Clayton{
1684b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1685b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
168684f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
168784f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
1688b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
168984f8075072eef306234f8109573067647735c111Greg Clayton
169084f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
169184f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
169284f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
169384f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
169484f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
1695b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
169684f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
169784f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
1698b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         &ast->Idents.get(name),
169984f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
170084f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
170184f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
17029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1703b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
170484f8075072eef306234f8109573067647735c111Greg Clayton}
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170684f8075072eef306234f8109573067647735c111Greg Claytonbool
1707462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
170884f8075072eef306234f8109573067647735c111Greg Clayton{
170984f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
171084f8075072eef306234f8109573067647735c111Greg Clayton    {
171184f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
171284f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
171384f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *class_type = class_qual_type.getTypePtr();
171484f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *super_type = super_qual_type.getTypePtr();
171584f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
171684f8075072eef306234f8109573067647735c111Greg Clayton        {
171784f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
171884f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
171984f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
172084f8075072eef306234f8109573067647735c111Greg Clayton            {
172184f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
172284f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
172384f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
172484f8075072eef306234f8109573067647735c111Greg Clayton                {
172584f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
172684f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
172784f8075072eef306234f8109573067647735c111Greg Clayton                }
172884f8075072eef306234f8109573067647735c111Greg Clayton            }
172984f8075072eef306234f8109573067647735c111Greg Clayton        }
173084f8075072eef306234f8109573067647735c111Greg Clayton    }
173184f8075072eef306234f8109573067647735c111Greg Clayton    return false;
173284f8075072eef306234f8109573067647735c111Greg Clayton}
173384f8075072eef306234f8109573067647735c111Greg Clayton
173484f8075072eef306234f8109573067647735c111Greg Clayton
173584f8075072eef306234f8109573067647735c111Greg Claytonbool
173684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
173784f8075072eef306234f8109573067647735c111Greg Clayton(
1738b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1739462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
174084f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1741462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
174284f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
174384f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
17441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
174584f8075072eef306234f8109573067647735c111Greg Clayton)
174684f8075072eef306234f8109573067647735c111Greg Clayton{
174784f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
174884f8075072eef306234f8109573067647735c111Greg Clayton        return false;
174984f8075072eef306234f8109573067647735c111Greg Clayton
1750b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
175184f8075072eef306234f8109573067647735c111Greg Clayton
1752b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
175384f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
175484f8075072eef306234f8109573067647735c111Greg Clayton
175584f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
175684f8075072eef306234f8109573067647735c111Greg Clayton
175784f8075072eef306234f8109573067647735c111Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
175884f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
175984f8075072eef306234f8109573067647735c111Greg Clayton    {
176084f8075072eef306234f8109573067647735c111Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
176184f8075072eef306234f8109573067647735c111Greg Clayton
176284f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
176384f8075072eef306234f8109573067647735c111Greg Clayton        {
176484f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
176584f8075072eef306234f8109573067647735c111Greg Clayton
176684f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
176784f8075072eef306234f8109573067647735c111Greg Clayton            {
176884f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
176984f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
177084f8075072eef306234f8109573067647735c111Greg Clayton                {
1771b01000fd063629facd45044f137446fb748ee179Greg Clayton                    APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
1772b01000fd063629facd45044f137446fb748ee179Greg Clayton                    bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
177384f8075072eef306234f8109573067647735c111Greg Clayton                }
177484f8075072eef306234f8109573067647735c111Greg Clayton
1775b01000fd063629facd45044f137446fb748ee179Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
17769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
17779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
17789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
17799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
17809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
17819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
17829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
17831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
17849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
17869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
17879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
17889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
17899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
179084f8075072eef306234f8109573067647735c111Greg Clayton            }
179184f8075072eef306234f8109573067647735c111Greg Clayton        }
179284f8075072eef306234f8109573067647735c111Greg Clayton    }
179384f8075072eef306234f8109573067647735c111Greg Clayton    return false;
179484f8075072eef306234f8109573067647735c111Greg Clayton}
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17979488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1798462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
17999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
18009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
18019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
18039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
18049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
18059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
18069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
18089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
18099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
18109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
18119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
18129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18139488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
18149488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
18159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
18169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
18179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
18189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
18199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
18209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
18239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
18249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
18259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
18269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
18279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
18281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1829462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
18301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
18311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1832b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
1833462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
18341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1835462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
18361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
18371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
18381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
18391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
18401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1842b01000fd063629facd45044f137446fb748ee179Greg Clayton    IdentifierTable *identifier_table = &ast->Idents;
18431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1844b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
18451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
18461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
18481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
18501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
18511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
18541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
18561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
18591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
18611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
18641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
18651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
18681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
18691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
18701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
18711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1872ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
18731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1874ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1875ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1876ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1877ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
18781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1879ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
18801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1881ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
18826bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        bool has_arg = (start[len] == ':');
18836bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
1884ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
18851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
18866bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
18876bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton            len += 1;
18881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
18891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
18921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
18931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1894b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
18951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
18961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
18981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
18991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
19001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *method_type(method_qual_type.getTypePtr());
19011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
19031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
19061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
19081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
19121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
19131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
19141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
19151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1918b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
19191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
19201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
19211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
19221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
19231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
19241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
19261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
19271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
19281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
19301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
19311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
19371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
19391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
1942b01000fd063629facd45044f137446fb748ee179Greg Clayton            params.push_back (ParmVarDecl::Create (*ast,
19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
19441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
19481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1953b01000fd063629facd45044f137446fb748ee179Greg Clayton        objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
19559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
19601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1963bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t
1964f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo
1965f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton(
1966f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type,
1967b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::ASTContext *ast,
1968f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t *pointee_or_element_clang_type
1969f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton)
1970bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
1971bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type == NULL)
1972f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return 0;
1973f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1974f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type)
1975f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        *pointee_or_element_clang_type = NULL;
1976bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1977bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1978bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1979bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1980bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    switch (type_class)
1981bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
198204325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
198304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
198404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
198504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
198604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
1987b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (ast && pointee_or_element_clang_type)
1988b01000fd063629facd45044f137446fb748ee179Greg Clayton                *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
198904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
1990f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1991f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        default:
1992f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
199304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
199404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return eTypeIsBuiltIn | eTypeHasValue;
1995f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1996f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::BlockPointer:
1997f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1998f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1999f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
2000f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2001e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                          return eTypeIsBuiltIn | eTypeHasValue;
2002f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2003f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ConstantArray:
2004f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::DependentSizedArray:
2005f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::IncompleteArray:
2006f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::VariableArray:
2007f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2008f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
2009f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsArray;
2010f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2011bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentName:                    return 0;
2012bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
2013bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
2014bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Decltype:                         return 0;
2015f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2016f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Enum:
2017f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2018f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
2019f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsEnumeration | eTypeHasValue;
2020f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2021bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Elaborated:                       return 0;
2022bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
2023bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
2024bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
2025bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::InjectedClassName:                return 0;
2026f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2027f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2028f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2029f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2030f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
2031f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
2032f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2033bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
2034f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2035f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ObjCObjectPointer:
2036f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2037f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2038f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
2039f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2040bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2041bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
2042f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2043f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Pointer:
2044f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
2045f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
2046f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
2047f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2048bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Record:
2049bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (qual_type->getAsCXXRecordDecl())
2050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
2051bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        else
2052bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsStructUnion;
2053bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        break;
2054bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
2055bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
2056bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
2057f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Typedef:
20599e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2060b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                  ast,
2061f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  pointee_or_element_clang_type);
2062f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOfExpr:                       return 0;
2064bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOf:                           return 0;
2065bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::UnresolvedUsing:                  return 0;
2066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
2067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    default:                                            return 0;
2068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
2069bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return 0;
2070bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
2071bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
20729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2076462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
208303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
208403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
20871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
20881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
20891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
20901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
20911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
20929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
20939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
20979e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
2107b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2109b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
2113b01000fd063629facd45044f137446fb748ee179Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
21149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
21159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2117960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
2118960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
2119960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2120f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::BuiltinType::ObjCId:    // child is Class
2121960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
2122960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
2123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2124960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2125960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
2126960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2127960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2128960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
2129c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2130e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex: return 0;
2131c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
21321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
21337a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
21759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
21767a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton        if (GetCompleteQualType (ast, qual_type))
21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
21829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
21839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
21859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
21869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
21889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
21899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
21909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
21929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
21939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
21949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
21959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
21969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
21979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
21989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
22019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
22029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
22039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
22049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
2206960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
2207960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
2208960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
2209b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2210b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2211960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
2212960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
2213960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
2214960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
2215960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
2216960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
2217960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2218960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2227c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            QualType pointee_type (pointer_type->getPointeeType());
2228b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2229b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
22309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
2232c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2233c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We have a pointer to a pointee type that claims it has no children.
2234c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We will want to look at
2235c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2236c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2242f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2243f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2244f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
2245f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2246f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
2247b01000fd063629facd45044f137446fb748ee179Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
2248b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                                             pointee_type.getAsOpaquePtr(),
2249f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                             omit_empty_base_classes);
2250f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            // If this type points to a simple type, then it has 1 child
2251f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (num_pointee_children == 0)
2252f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = 1;
2253f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
2254f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = num_pointee_children;
2255f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
2256f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
2257f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2258f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
22591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
2260b01000fd063629facd45044f137446fb748ee179Greg Clayton        num_children = ClangASTContext::GetNumChildren (ast,
2261b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
2262b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                        omit_empty_base_classes);
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2271c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no
2272c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a
2273c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer,
2274c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type
2275c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show.
2276c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t
2277c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2278c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{
2279c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (clang_type == NULL)
2280c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        return 0;
2281c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2282c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2283c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2284c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    switch (type_class)
2285c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
22869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    case clang::Type::Builtin:
22879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
22889db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        {
22899db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Void:
22909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::NullPtr:
22919db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 0;
22929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Bool:
22939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_U:
22949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UChar:
2295ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_U:
22969db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char16:
22979db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char32:
22989db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UShort:
22999db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt:
23009db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULong:
23019db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULongLong:
23029db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt128:
23039db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_S:
23049db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::SChar:
2305ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan        case clang::BuiltinType::WChar_S:
23069db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Short:
23079db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int:
23089db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Long:
23099db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongLong:
23109db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int128:
23119db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Float:
23129db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Double:
23139db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongDouble:
23149db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Dependent:
23159db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Overload:
23169db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UndeducedAuto:
23179db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCId:
23189db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCClass:
23199db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCSel:
23209db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 1;
23219db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        }
23229db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        break;
23239db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
2324e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                  return 1;
2325c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Pointer:                  return 1;
2326c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
2327c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::LValueReference:          return 1;
2328c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::RValueReference:          return 1;
2329c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::MemberPointer:            return 0;
2330c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ConstantArray:            return 0;
2331c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::IncompleteArray:          return 0;
2332c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::VariableArray:            return 0;
2333c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedArray:      return 0;
2334c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedExtVector:  return 0;
2335c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Vector:                   return 0;
2336c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ExtVector:                return 0;
2337c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
2338c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
2339c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::UnresolvedUsing:          return 0;
2340c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Paren:                    return 0;
2341c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2342c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOfExpr:               return 0;
2343c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOf:                   return 0;
2344c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Decltype:                 return 0;
2345c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Record:                   return 0;
2346c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Enum:                     return 1;
2347c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Elaborated:               return 1;
2348c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateTypeParm:         return 1;
2349c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::SubstTemplateTypeParm:    return 1;
2350c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateSpecialization:   return 1;
2351c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::InjectedClassName:        return 0;
2352c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentName:            return 1;
2353c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return 1;
2354c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObject:               return 0;
2355c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCInterface:            return 0;
2356c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObjectPointer:        return 1;
2357c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    default:
2358c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        break;
2359c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2360c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    return 0;
2361c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton}
236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2363462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2367462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2375bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
237600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
237700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
2392bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_bitfield_bit_offset,
239300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_base_class,
239400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                         child_is_deref_of_parent);
239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2398462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
2401b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2403462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
241200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_base_class,
241300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    bool &child_is_deref_of_parent
241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2419b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
2424bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        child_is_base_class = false;
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
242603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
242703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2429960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
2430960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2431960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
2432960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
2433960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
243404325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_name = "isa";
2435b01000fd063629facd45044f137446fb748ee179Greg Clayton                child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
2436b01000fd063629facd45044f137446fb748ee179Greg Clayton                return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
2437960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2438960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
2439960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
2440960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
2441960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2442960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
24431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
24447a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
2449b01000fd063629facd45044f137446fb748ee179Greg Clayton                const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
2478a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
2480a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2489b01000fd063629facd45044f137446fb748ee179Greg Clayton                            uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes biut sizes should be a multiple of 8 bits in size
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
2494bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            child_is_base_class = true;
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
2515b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
251654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
2523b01000fd063629facd45044f137446fb748ee179Greg Clayton                        if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
25339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
25347a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, parent_qual_type))
25359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
25369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
25379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
25389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
25399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
25409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
25419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
25429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
25449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
25459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2546b01000fd063629facd45044f137446fb748ee179Greg Clayton                        const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
25479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
25489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
25499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
25509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
25519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2552b01000fd063629facd45044f137446fb748ee179Greg Clayton                                if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
25539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
25549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
25559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
2556b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
25579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
25609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2561b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
25629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2564960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
2565bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                        child_is_base_class = true;
25669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
25689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
25699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
25719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
25729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
25739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
25749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
25759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2576960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2577960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
25789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
25809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
25819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
25829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
25849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
25859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
25869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
25879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
25889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
25909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
25929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2593b01000fd063629facd45044f137446fb748ee179Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
25949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
25969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
2598960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                    bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
25999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_offset = bit_offset / 8;
26009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
26029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
26039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
26049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
26059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
26069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
26079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
26089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
26099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
26109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
26129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2613960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2614960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2615960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2616960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2617960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
261800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
261900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
2620b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetChildClangTypeAtIndex (ast,
2621960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2622960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2623960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2624960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2625960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
2626960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2627960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2628960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2629960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2630bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
263100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
263200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2633960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2634960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2635960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
263600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
2637960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2638960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2639960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2640960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2641960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2642960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2643960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2644960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2645960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2646b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2647960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2648960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2649960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2650960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2651960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2652960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
26539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
26549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
26559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
26561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
2663b01000fd063629facd45044f137446fb748ee179Greg Clayton                    if (GetCompleteQualType (ast, array->getElementType()))
2664b01000fd063629facd45044f137446fb748ee179Greg Clayton                    {
2665b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2667b01000fd063629facd45044f137446fb748ee179Greg Clayton                        char element_name[64];
2668b01000fd063629facd45044f137446fb748ee179Greg Clayton                        ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2670b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_name.assign(element_name);
2671b01000fd063629facd45044f137446fb748ee179Greg Clayton                        assert(field_type_info.first % 8 == 0);
2672b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_size = field_type_info.first / 8;
2673b01000fd063629facd45044f137446fb748ee179Greg Clayton                        child_byte_offset = idx * child_byte_size;
2674b01000fd063629facd45044f137446fb748ee179Greg Clayton                        return array->getElementType().getAsOpaquePtr();
2675b01000fd063629facd45044f137446fb748ee179Greg Clayton                    }
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
26849db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
26859db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                // Don't dereference "void *" pointers
26869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                if (pointee_type->isVoidType())
26879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                    return NULL;
268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
269100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
269200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
2693b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetChildClangTypeAtIndex (ast,
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
2703bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
270400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
270500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
270900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = true;
271000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
2720b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::LValueReference:
2731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::RValueReference:
2732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            {
2733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
2734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                QualType pointee_type(reference_type->getPointeeType());
2735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
273800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    child_is_deref_of_parent = false;
273900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    bool tmp_child_is_deref_of_parent = false;
2740b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetChildClangTypeAtIndex (ast,
2741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     parent_name,
2742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     pointee_clang_type,
2743f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     idx,
2744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     transparent_pointers,
2745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     omit_empty_base_classes,
2746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_name,
2747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_size,
2748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_offset,
2749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_size,
2750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_offset,
275100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     child_is_base_class,
275200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                     tmp_child_is_deref_of_parent);
2753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                else
2755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (parent_name)
2757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name.assign(1, '&');
2759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name += parent_name;
2760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer to an simple type
2763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (idx == 0)
2764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2765b01000fd063629facd45044f137446fb748ee179Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
2766f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        assert(clang_type_info.first % 8 == 0);
2767f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_size = clang_type_info.first / 8;
2768f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_offset = 0;
2769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        return pointee_type.getAsOpaquePtr();
2770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2771f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2772f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            }
2773f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2774f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
27751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
2776b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetChildClangTypeAtIndex (ast,
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
27789e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                             cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
2786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_bitfield_bit_offset,
278700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_base_class,
278800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                             child_is_deref_of_parent);
278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2795f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2801b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
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            if (omit_empty_base_classes)
285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
2975b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
2976462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
298503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
298603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
29897a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
3022b01000fd063629facd45044f137446fb748ee179Greg Clayton                    IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name));
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
30779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
30787a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
30799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
30809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
30819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
30829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
30839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
30849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
30859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
30869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
30879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
30889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
30899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
30909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
30919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
30929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3093823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
30949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
30959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
30969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
30979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
30989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
30999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
31009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
31019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
31029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
31049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
31059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
31069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
31079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
31099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
31109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
31119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
31129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
31139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
31149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
3115b01000fd063629facd45044f137446fb748ee179Greg Clayton                            if (GetIndexOfChildMemberWithName (ast,
3116b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                               ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
31179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
31209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
31219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
31229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
31239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
31249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
31259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
31279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
31289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
31299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
31309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
31319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
31329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
31339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
31349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
31359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
31379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3138b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildMemberWithName (ast,
31399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
31409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
31419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
31429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
31439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
31449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
31459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3154b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3175b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
31821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
31831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3190b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3206b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildMemberWithName (ast,
320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3223b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3234b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildMemberWithName (ast,
32359e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                                  cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3255b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
3256462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
32649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
326503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
32669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
326703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
32707a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
327724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
33139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
33147a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton            if (GetCompleteQualType (ast, qual_type))
33159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
33169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
33179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
33189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
33199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
33209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
33219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
33229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
33239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
33259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
33269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
33279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
33289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
33309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
33319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
33329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
33349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
33359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
33369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
33379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
33389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
33409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
33419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
33429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
33449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
33459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
33469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
33479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
33489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
33499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
33509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
33519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
33529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
33549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
3355b01000fd063629facd45044f137446fb748ee179Greg Clayton                return GetIndexOfChildWithName (ast,
33569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
33579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
33589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
33599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
33609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
33619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
33621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3369b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
3390b01000fd063629facd45044f137446fb748ee179Greg Clayton//                    return GetIndexOfChildWithName (ast,
339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
33971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
33981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3405b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
3420b01000fd063629facd45044f137446fb748ee179Greg Clayton                    return GetIndexOfChildWithName (ast,
342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
3436b01000fd063629facd45044f137446fb748ee179Greg Clayton//                        std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
3447b01000fd063629facd45044f137446fb748ee179Greg Clayton            return GetIndexOfChildWithName (ast,
34489e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3462462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
34671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = tag_qual_type.getTypePtr();
346824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
346924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(clang_type);
347124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
347224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
347324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
347424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
3489462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
349124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
349503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
349603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
34999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
35009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
35019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
35029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
35039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
35049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
35059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
35069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
35079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
35089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
35099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
35109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
35119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
35129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
35139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
35149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
35159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
35169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
35179e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
35189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
35199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
35209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
35219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
35229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
35239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3538b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
3540b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
3541b01000fd063629facd45044f137446fb748ee179Greg Clayton        return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), &ast->Idents.get(name));
354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
3550462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3554b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3555b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3559b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3560b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
3562b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        DeclarationName (&ast->Idents.get(name)),
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3571b01000fd063629facd45044f137446fb748ee179Greg Clayton            return FunctionDecl::Create(*ast,
3572b01000fd063629facd45044f137446fb748ee179Greg Clayton                                        ast->getTranslationUnitDecl(),
357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3585462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3586b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast,
3587462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
3588462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
35892ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
35902ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
35912ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3593b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
3599ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    FunctionProtoType::ExtProtoInfo proto_info;
3600ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Variadic = is_variadic;
3601ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.HasExceptionSpec = false;
3602ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.HasAnyExceptionSpec = false;
3603ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.TypeQuals = type_quals;
3604ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.NumExceptions = 0;
3605ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan    proto_info.Exceptions = NULL;
3606ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan
3607b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
360853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
3610ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                                        proto_info).getAsOpaquePtr();    // NoReturn);
361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3614462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3616b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3617b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
3618b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ParmVarDecl::Create(*ast,
3619b01000fd063629facd45044f137446fb748ee179Greg Clayton                                ast->getTranslationUnitDecl(),
362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
3621b01000fd063629facd45044f137446fb748ee179Greg Clayton                                name && name[0] ? &ast->Idents.get(name) : NULL,
36222ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3639462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3640462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3644b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
3645b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
3647b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3659462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
36641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *t = qual_type.getTypePtr();
366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3683462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
368524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
368624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
368724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
368855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
368955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
369055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
369155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
369355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
369455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
369555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
369655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
369755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
369804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
369904325065a00f646527db85e9bc751da29ac53b23Sean Callanan
370004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        if (objc_class_type)
370104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
370204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
370304325065a00f646527db85e9bc751da29ac53b23Sean Callanan
370404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            class_interface_decl->setForwardDecl(false);
370504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
370604325065a00f646527db85e9bc751da29ac53b23Sean Callanan
370755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
370855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
370955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
371055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
371155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
371255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
371355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
371555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
371655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
371755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
371855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
371955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
3720b01000fd063629facd45044f137446fb748ee179Greg Clayton                ASTContext *ast = getASTContext();
372148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
372248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                QualType promotion_qual_type;
372348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // If the enum integer type is less than an integer in bit width,
372448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // then we must promote it to an integer size.
3725b01000fd063629facd45044f137446fb748ee179Greg Clayton                if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
372648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                {
372748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
3728b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->IntTy;
372948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    else
3730b01000fd063629facd45044f137446fb748ee179Greg Clayton                        promotion_qual_type = ast->UnsignedIntTy;
373148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                }
373248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                else
373348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
373448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
373548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
373655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3746462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
37470d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType
37480d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton(
37490d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const char *name,
37500d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    DeclContext *decl_ctx,
37510d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const Declaration &decl,
37520d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    clang_type_t integer_qual_type
37530d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton)
375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
375624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
3757b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3758b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
375948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
376048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    // TODO: ask about these...
376148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsScoped = false;
376248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsFixed = false;
376348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
3764b01000fd063629facd45044f137446fb748ee179Greg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast,
37650d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                                            decl_ctx,
376648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
3767b01000fd063629facd45044f137446fb748ee179Greg Clayton                                            name && name[0] ? &ast->Idents.get(name) : NULL,
376848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
37699e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            NULL,
37709e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScoped
37719e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScopedUsingClassTag
37729e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false); // IsFixed
3773864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3774864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3776e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3777e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3778e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
3779864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3780864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
3781864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
3782b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
3783e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3787462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3788462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3789462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3790462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3791462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3792462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang::Type *clang_type = enum_qual_type.getTypePtr();
3793462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3794462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3795462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3796462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3797462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3798462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3799462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3800462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3801462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3802462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3803462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3804462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3808462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3809462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
3820b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3823b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
382624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = enum_qual_type.getTypePtr();
382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
383024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
383524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
3837b01000fd063629facd45044f137446fb748ee179Greg Clayton                    EnumConstantDecl::Create (*ast,
3838b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_type->getDecl(),
3839b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              SourceLocation(),
3840b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              name ? &identifier_table->get(name) : NULL,    // Identifier
3841b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              QualType::getFromOpaquePtr(enumerator_clang_type),
3842b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              NULL,
3843b01000fd063629facd45044f137446fb748ee179Greg Clayton                                              enum_llvm_apsint);
3844b01000fd063629facd45044f137446fb748ee179Greg Clayton
384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
385424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3858462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3859462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
386024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3861427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return CreatePointerType (getASTContext(), clang_type);
3862427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3863427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t
3865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
3866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
3867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (ast && clang_type)
38687b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
38697b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
38707b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
387103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
387203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
38737b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
38747b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
38757b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
3876427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
38777b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
38787b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
3879427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getPointerType(qual_type).getAsOpaquePtr();
38807b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
38817b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3885462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
38866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
38876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
38906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
389324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3894462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
38956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
38966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
389724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
389824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
38996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3903462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3904462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
3905fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
3906fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
3907fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
3908fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
3909fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
3910fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
3911fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
3912bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t
391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3915b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
3916b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ast->getTypeSize(ast->VoidPtrTy);
391724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
391824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
391924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3920462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
392124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
392224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
392324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
392424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
392603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
392703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
392824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
392904325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
393004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
393104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
393204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        default:
393304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            break;
393404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
393504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
393604325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return true;
393704325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
393804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return false;
39391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
394224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
394924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
395024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
395224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
396124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
39649e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
396524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
396624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
396724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
396824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
397024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
397124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3972462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
398724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
399124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3992462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
399424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
399524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
399703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
399803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
400004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::Type::Builtin:
400104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            switch (cast<clang::BuiltinType>(qual_type)->getKind())
400204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            {
400304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            default:
400404325065a00f646527db85e9bc751da29ac53b23Sean Callanan                break;
400504325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCId:
400604325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCClass:
400704325065a00f646527db85e9bc751da29ac53b23Sean Callanan                return true;
400804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            }
400904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return false;
40101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
401524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
402024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
402424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
40261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
40279e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
402824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
402924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
403224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4036462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
403824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
403924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
404024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
404124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
404724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
404824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
404924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
405024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
405124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
405224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
405324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
405624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
405724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
405824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
406024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
406124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
406224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
406324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
406424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
406524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
406624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
407024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4075bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool
4076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
4077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
4078bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type)
4079bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
4080bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4081bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4082bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4083bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (cxx_record_decl)
4084bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
4085bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
4086bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return true;
4087bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
4088bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
4089bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    class_name.clear();
4090bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return false;
4091bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
4092bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
4093bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
40941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4095462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
40961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
40971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
40981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
40991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
41001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
41011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
41021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
41031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
41041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
41051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
41061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
4107462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
41081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
41091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
41101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
41111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
41121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
41131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
41141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
41151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
41161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
41171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
41181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
4119f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool
4120f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type)
4121f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4122f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return QualType::getFromOpaquePtr(clang_type)->isCharType();
4124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return false;
4125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
412624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
412724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4128462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
412924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t pointee_or_element_clang_type = NULL;
4131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
4132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4133f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type == NULL)
4134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return false;
4135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
413724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
4139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
4140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
414124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (type_flags.Test (eTypeIsArray))
414424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We know the size of the array and it could be a C string
4146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // since it is an array of characters
4147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
4148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
414924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
4150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
415124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
4152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = 0;
4153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
415424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
415524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
415624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
415724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
415824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
415924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
416024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
416124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
4162462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
416303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
416403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
416503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
416603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
416703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
416803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
416903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
417003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
417103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
417203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
417303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
417403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
41759e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
417603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
417703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
417803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
417903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
418003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
418103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
418203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
418303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
418403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
418503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
418603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
418703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
418803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
418903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
4190f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t
4191f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type)
4192f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
4193f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
4194f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
4195f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
4196f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (array)
4197f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return array->getSize().getLimitedValue();
4198f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
4199f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return 0;
4200f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
420103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
420203e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
4203462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
420424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
420524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
420624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
420724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
420824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
420924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
421003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
421103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
421224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
421424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
421524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
421624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
421724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
421824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
42191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
422024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
422124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
422224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
422324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
422424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
42251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
422624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
422724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
422824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
422924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
42301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
423124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
423224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
423324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
423424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
423524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
423624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
423724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
423824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
423924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
424024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
424124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
424224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4243462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
4244462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
424524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
424624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
424724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
424824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4249b01000fd063629facd45044f137446fb748ee179Greg Clayton        ASTContext *ast = getASTContext();
425024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
4251b01000fd063629facd45044f137446fb748ee179Greg Clayton        assert (ast != NULL);
425224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
425324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
4254b01000fd063629facd45044f137446fb748ee179Greg Clayton            decl_ctx = ast->getTranslationUnitDecl();
4255b01000fd063629facd45044f137446fb748ee179Greg Clayton        TypedefDecl *decl = TypedefDecl::Create (*ast,
4256b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 decl_ctx,
4257b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 SourceLocation(),
4258b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 name ? &identifier_table->get(name) : NULL, // Identifier
4259b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                 ast->CreateTypeSourceInfo(qual_type));
4260864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
4261864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan        decl->setAccess(AS_public); // TODO respect proper access specifier
426224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
426324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
4264b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getTypedefType (decl).getAsOpaquePtr();
426524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
426624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
426724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
426824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
426924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
427024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
4271462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
427224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
427324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
427424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4275462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type));
427624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4277462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
427824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
427924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4280462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const TypedefDecl *typedef_decl = typedef_type->getDecl();
428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
428224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
428324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
428424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
428524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
428624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
428724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
428824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
428924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
429024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
429124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
429224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
429324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
429424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
429524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
429624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
429724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
4298b01000fd063629facd45044f137446fb748ee179Greg 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)
429924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
430024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
430124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
430224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
430324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
430424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
430524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
430624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
430724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
430824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
431024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
431224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
431324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
431424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
431524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
431624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
431724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
431824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
431924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
432024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
432124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
432224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
432324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
432424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
432524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
432624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
432724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
433124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
433224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
4333b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
433524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
433724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
433924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
434224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
434324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
4347b01000fd063629facd45044f137446fb748ee179Greg Clayton            APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4349b01000fd063629facd45044f137446fb748ee179Greg Clayton            const uint64_t bit_size = ast->getTypeSize (qual_type);
435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
435124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
435224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
436024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4370a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4371a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
4372462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
4373a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
4374a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
4375a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4376a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4377a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4378a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
4379a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
4380b01000fd063629facd45044f137446fb748ee179Greg Clayton
4381b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4382b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
4383b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4384b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (clang_type == NULL)
4385b01000fd063629facd45044f137446fb748ee179Greg Clayton        return false;
4386b01000fd063629facd45044f137446fb748ee179Greg Clayton
43877a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton    return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
4388b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4389b01000fd063629facd45044f137446fb748ee179Greg Clayton
4390b01000fd063629facd45044f137446fb748ee179Greg Clayton
4391b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
4392b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type)
4393b01000fd063629facd45044f137446fb748ee179Greg Clayton{
4394b01000fd063629facd45044f137446fb748ee179Greg Clayton    return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
4395b01000fd063629facd45044f137446fb748ee179Greg Clayton}
4396b01000fd063629facd45044f137446fb748ee179Greg Clayton
4397