ClangASTContext.cpp revision 7b54103814527f5eeaa022d1a8a20cf8d2d864e5
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
17bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#define NDEBUG
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTImporter.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/CXXInheritance.h"
2184f8075072eef306234f8109573067647735c111Greg Clayton#include "clang/AST/DeclObjC.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h"
31bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
36f05633b35544b5d095feb05680c8728be087e441Eli Friedman
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4184f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
4284f8075072eef306234f8109573067647735c111Greg ClaytonConvertAccessTypeToAccessSpecifier (ClangASTContext::AccessType access)
4384f8075072eef306234f8109573067647735c111Greg Clayton{
4484f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
4584f8075072eef306234f8109573067647735c111Greg Clayton    {
4684f8075072eef306234f8109573067647735c111Greg Clayton    default:                                break;
4784f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessNone:      return AS_none;
4884f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessPublic:    return AS_public;
4984f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessPrivate:   return AS_private;
5084f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessProtected: return AS_protected;
5184f8075072eef306234f8109573067647735c111Greg Clayton    }
5284f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
5384f8075072eef306234f8109573067647735c111Greg Clayton}
5484f8075072eef306234f8109573067647735c111Greg Clayton
5584f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
5684f8075072eef306234f8109573067647735c111Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (ClangASTContext::AccessType access)
5784f8075072eef306234f8109573067647735c111Greg Clayton{
5884f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
5984f8075072eef306234f8109573067647735c111Greg Clayton    {
6084f8075072eef306234f8109573067647735c111Greg Clayton    default:                                break;
6184f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessNone:      return ObjCIvarDecl::None;
6284f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessPublic:    return ObjCIvarDecl::Public;
6384f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessPrivate:   return ObjCIvarDecl::Private;
6484f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessProtected: return ObjCIvarDecl::Protected;
6584f8075072eef306234f8109573067647735c111Greg Clayton    case ClangASTContext::eAccessPackage:   return ObjCIvarDecl::Package;
6684f8075072eef306234f8109573067647735c111Greg Clayton    }
6784f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
6884f8075072eef306234f8109573067647735c111Greg Clayton}
6984f8075072eef306234f8109573067647735c111Greg Clayton
7084f8075072eef306234f8109573067647735c111Greg Clayton
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
75e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
83e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
85e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
86e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
87e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
88e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
97e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
98e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(0 && "Invalid input kind!");
100e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
103e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
104e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
105e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
106e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
110e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
112e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
113e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.setVisibilityMode(LangOptions::Default);
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) :
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap(),
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap()
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_ast_context_ap.get() == NULL)
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_ast_context_ap.reset(
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            new ASTContext(
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getLanguageOptions(),
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSourceManager(),
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getTargetInfo(),
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getIdentifierTable(),
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSelectorTable(),
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getBuiltinContext()));
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_ast_context_ap.get();
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
336e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
337e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
3541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic()));
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_diagnostic_ap.reset(new Diagnostic());
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, uint32_t bit_size)
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast_context, lldb::Encoding encoding, uint32_t bit_size)
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!ast_context)
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingInvalid:
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->VoidPtrTy.getAsOpaquePtr();
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingUint:
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedCharTy.getAsOpaquePtr();
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedShortTy.getAsOpaquePtr();
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedIntTy.getAsOpaquePtr();
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongTy.getAsOpaquePtr();
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingSint:
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->CharTy.getAsOpaquePtr();
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->ShortTy.getAsOpaquePtr();
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->IntTy.getAsOpaquePtr();
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongTy.getAsOpaquePtr();
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongLongTy.getAsOpaquePtr();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->Int128Ty.getAsOpaquePtr();
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingIEEE754:
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->FloatTy.getAsOpaquePtr();
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->DoubleTy.getAsOpaquePtr();
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongDoubleTy.getAsOpaquePtr();
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingVector:
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context)
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->VoidPtrTy.getAsOpaquePtr();
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->BoolTy.getAsOpaquePtr();
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatComplexTy.getAsOpaquePtr();
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleComplexTy.getAsOpaquePtr();
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatTy.getAsOpaquePtr();
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleTy.getAsOpaquePtr();
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleTy.getAsOpaquePtr();
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "int") ||
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed int"))
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->IntTy.getAsOpaquePtr();
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->Int128Ty.getAsOpaquePtr();
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "long int") ||
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "long long int") ||
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed long long"))
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongTy.getAsOpaquePtr();
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongLongTy.getAsOpaquePtr();
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "short") ||
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short int") ||
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed short") ||
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short signed int"))
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->ShortTy.getAsOpaquePtr();
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "char") ||
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed char"))
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->CharTy.getAsOpaquePtr();
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "wchar_t"))
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->WCharTy.getAsOpaquePtr();
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->ShortTy.getAsOpaquePtr();
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->IntTy.getAsOpaquePtr();
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongTy.getAsOpaquePtr();
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongLongTy.getAsOpaquePtr();
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->Int128Ty.getAsOpaquePtr();
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->SignedCharTy.getAsOpaquePtr();
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned int"))
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedIntTy.getAsOpaquePtr();
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned int") ||
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "long unsigned int") ||
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "unsigned long long"))
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongTy.getAsOpaquePtr();
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned short") ||
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short unsigned int"))
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedShortTy.getAsOpaquePtr();
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned char"))
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedCharTy.getAsOpaquePtr();
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongTy.getAsOpaquePtr();
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidBuiltInType()
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->VoidTy.getAsOpaquePtr();
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (clang::ASTContext *ast_context, bool is_const)
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType void_ptr_type(ast_context->VoidPtrTy);
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CopyType(clang::ASTContext *dest_context,
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          clang::ASTContext *source_context,
69584f8075072eef306234f8109573067647735c111Greg Clayton                          void *clang_type)
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Diagnostic diagnostics;
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileManager file_manager;
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTImporter importer(diagnostics,
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         *dest_context, file_manager,
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         *source_context, file_manager);
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type));
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ret.getAsOpaquePtr();
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7068d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
7078d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean CallananClangASTContext::AreTypesSame(clang::ASTContext *ast_context,
7085510dddc33260a991284ef81ca343594f23262e8Sean Callanan             void *type1,
7095510dddc33260a991284ef81ca343594f23262e8Sean Callanan             void *type2)
7105510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
7115510dddc33260a991284ef81ca343594f23262e8Sean Callanan    return ast_context->hasSameType(QualType::getFromOpaquePtr(type1),
7125510dddc33260a991284ef81ca343594f23262e8Sean Callanan                                    QualType::getFromOpaquePtr(type2));
7135510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
7145510dddc33260a991284ef81ca343594f23262e8Sean Callanan
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddConstModifier (void *clang_type)
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddRestrictModifier (void *clang_type)
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddVolatileModifier (void *clang_type)
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
7569488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, lldb::LanguageType language)
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        decl_ctx = ast_context->getTranslationUnitDecl();
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
7659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (language == lldb::eLanguageTypeObjC)
7669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
7679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isForwardDecl = false;
7689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
7699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
7709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
7719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name && name[0] ? &ast_context->Idents.get(name) : NULL);
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTagDeclType(decl).getAsOpaquePtr();
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
78784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
78884f8075072eef306234f8109573067647735c111Greg Clayton(
78984f8075072eef306234f8109573067647735c111Greg Clayton    void *record_clang_type,
79084f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
79184f8075072eef306234f8109573067647735c111Greg Clayton    void *field_type,
79284f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
79384f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
79484f8075072eef306234f8109573067647735c111Greg Clayton)
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IdentifierTable *identifier_table = getIdentifierTable();
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    clang::Type *clang_type = record_qual_type.getTypePtr();
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                cxx_record_decl->setEmpty (false);
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bit_width = new (*ast_context)IntegerLiteral (bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
82684f8075072eef306234f8109573067647735c111Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast_context,
82784f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
82884f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
82984f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
83084f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
83184f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
83284f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
83384f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83584f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
8449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
8459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
8469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
8479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
8489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                bool isSynthesized = false;
8499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ClangASTContext::AddObjCClassIVar (record_clang_type,
8509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
8519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
8529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
8539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
8549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   isSynthesized);
8559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
8569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context == NULL || field == NULL)
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetDefaultAccessForRecordFields (void *clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type)
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
9261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = qual_type.getTypePtr();
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl *record_decl = record_type->getDecl();
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (record_decl)
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t field_idx;
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RecordDecl::field_iterator field, field_end;
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         field != field_end;
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++field, ++field_idx)
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // If no accessibility was assigned, assign the correct one
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            field->setAccess ((AccessSpecifier)default_accessibility);
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
95484f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateBaseClassSpecifier (void *base_class_type, AccessType access, bool is_virtual, bool base_of_class)
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return new CXXBaseSpecifier(SourceRange(), is_virtual, base_of_class, (AccessSpecifier)access, QualType::getFromOpaquePtr(base_class_type));
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
961e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
962e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
963e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
964e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
965e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
966e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
967e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
968e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
969e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
970e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetBaseClassesForClassType (void *class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //cxx_record_decl->setEmpty (false);
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cxx_record_decl->setBases(base_classes, num_base_classes);
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
99484f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
99584f8075072eef306234f8109573067647735c111Greg Clayton
99684f8075072eef306234f8109573067647735c111Greg Claytonvoid *
99784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
99884f8075072eef306234f8109573067647735c111Greg Clayton(
99984f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
100084f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
100184f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
100284f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
100384f8075072eef306234f8109573067647735c111Greg Clayton)
100484f8075072eef306234f8109573067647735c111Greg Clayton{
100584f8075072eef306234f8109573067647735c111Greg Clayton    ASTContext *ast_context = getASTContext();
100684f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
100784f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
100884f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
100984f8075072eef306234f8109573067647735c111Greg Clayton        decl_ctx = ast_context->getTranslationUnitDecl();
101084f8075072eef306234f8109573067647735c111Greg Clayton
101184f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
101284f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
101384f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
101484f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
101584f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
101684f8075072eef306234f8109573067647735c111Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context,
101784f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
101884f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
101984f8075072eef306234f8109573067647735c111Greg Clayton                                                         &ast_context->Idents.get(name),
102084f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
102184f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
102284f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
10239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
10249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr();
102584f8075072eef306234f8109573067647735c111Greg Clayton}
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102784f8075072eef306234f8109573067647735c111Greg Claytonbool
102884f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::SetObjCSuperClass (void *class_opaque_type, void *super_opaque_type)
102984f8075072eef306234f8109573067647735c111Greg Clayton{
103084f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
103184f8075072eef306234f8109573067647735c111Greg Clayton    {
103284f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
103384f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
103484f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *class_type = class_qual_type.getTypePtr();
103584f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *super_type = super_qual_type.getTypePtr();
103684f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
103784f8075072eef306234f8109573067647735c111Greg Clayton        {
103884f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
103984f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
104084f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
104184f8075072eef306234f8109573067647735c111Greg Clayton            {
104284f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
104384f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
104484f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
104584f8075072eef306234f8109573067647735c111Greg Clayton                {
104684f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
104784f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
104884f8075072eef306234f8109573067647735c111Greg Clayton                }
104984f8075072eef306234f8109573067647735c111Greg Clayton            }
105084f8075072eef306234f8109573067647735c111Greg Clayton        }
105184f8075072eef306234f8109573067647735c111Greg Clayton    }
105284f8075072eef306234f8109573067647735c111Greg Clayton    return false;
105384f8075072eef306234f8109573067647735c111Greg Clayton}
105484f8075072eef306234f8109573067647735c111Greg Clayton
105584f8075072eef306234f8109573067647735c111Greg Clayton
105684f8075072eef306234f8109573067647735c111Greg Claytonbool
105784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
105884f8075072eef306234f8109573067647735c111Greg Clayton(
105984f8075072eef306234f8109573067647735c111Greg Clayton    void *class_opaque_type,
106084f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
106184f8075072eef306234f8109573067647735c111Greg Clayton    void *ivar_opaque_type,
106284f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
106384f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
106484f8075072eef306234f8109573067647735c111Greg Clayton    bool isSynthesized
106584f8075072eef306234f8109573067647735c111Greg Clayton)
106684f8075072eef306234f8109573067647735c111Greg Clayton{
106784f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
106884f8075072eef306234f8109573067647735c111Greg Clayton        return false;
106984f8075072eef306234f8109573067647735c111Greg Clayton
107084f8075072eef306234f8109573067647735c111Greg Clayton    ASTContext *ast_context = getASTContext();
107184f8075072eef306234f8109573067647735c111Greg Clayton    IdentifierTable *identifier_table = getIdentifierTable();
107284f8075072eef306234f8109573067647735c111Greg Clayton
107384f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
107484f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
107584f8075072eef306234f8109573067647735c111Greg Clayton
107684f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
107784f8075072eef306234f8109573067647735c111Greg Clayton
107884f8075072eef306234f8109573067647735c111Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
107984f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
108084f8075072eef306234f8109573067647735c111Greg Clayton    {
108184f8075072eef306234f8109573067647735c111Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
108284f8075072eef306234f8109573067647735c111Greg Clayton
108384f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
108484f8075072eef306234f8109573067647735c111Greg Clayton        {
108584f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
108684f8075072eef306234f8109573067647735c111Greg Clayton
108784f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
108884f8075072eef306234f8109573067647735c111Greg Clayton            {
108984f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
109084f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
109184f8075072eef306234f8109573067647735c111Greg Clayton                {
109284f8075072eef306234f8109573067647735c111Greg Clayton                    APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
109384f8075072eef306234f8109573067647735c111Greg Clayton                    bit_width = new (*ast_context)IntegerLiteral (bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
109484f8075072eef306234f8109573067647735c111Greg Clayton                }
109584f8075072eef306234f8109573067647735c111Greg Clayton
10969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context,
10979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
10989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
10999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
11009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
11019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
11029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
11039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
11049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            isSynthesized);
11059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
11079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
11089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
11099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
11109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
111184f8075072eef306234f8109573067647735c111Greg Clayton            }
111284f8075072eef306234f8109573067647735c111Greg Clayton        }
111384f8075072eef306234f8109573067647735c111Greg Clayton    }
111484f8075072eef306234f8109573067647735c111Greg Clayton    return false;
111584f8075072eef306234f8109573067647735c111Greg Clayton}
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11189488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
11199488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCTypeHasIVars (void *class_opaque_type, bool check_superclass)
11209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
11219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
11229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
11249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
11259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
11269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
11279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
11299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
11309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
11319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
11329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
11339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11349488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
11359488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
11369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
11379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
11389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
11399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
11409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
11419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
11439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
11449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
11459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
11469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
11479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
11489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
11499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
11509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsAggregateType (void *clang_type)
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type->isAggregateType ())
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
11671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
11681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
11691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
11701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
11711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
11729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
11739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
11749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_classes)
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type == NULL)
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
11959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
11969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
12409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
12419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
12429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
12439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
12449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
12459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
12469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
12479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
12489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
12499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
12509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
12519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
12529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
12539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
12549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
12559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
12569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
12579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
12589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
12599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
12609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
12619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
12629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
12639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
12649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
12659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
12669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
12679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
12689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
12699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
12709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return ClangASTContext::GetNumChildren (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
12719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
12729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
12731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            QualType pointee_type = pointer_type->getPointeeType();
12819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
12829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If this type points to a simple type, then it has 1 child
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = 1;
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes);
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *parent_clang_type,
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_offset
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_offset);
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *parent_clang_type,
133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_offset
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (parent_qual_type->getTypeClass())
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl);
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bit_offset = record_layout.getBaseClassOffset(base_class_decl);
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes biut sizes should be a multiple of 8 bits in size
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
143154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
14489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
14499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
14509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
14519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
14529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
14539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
14549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
14559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
14569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
14589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
14599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl);
14619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
14629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
14639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
14649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
14659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
14669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (ClangASTContext::GetNumChildren(superclass_interface_decl, omit_empty_base_classes) > 0)
14679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
14689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
14699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
14709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl));
14719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
14749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
14769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
14789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        // Figure out the field offset within the current struct/union/class type
14809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        bit_offset = interface_layout.getFieldOffset (child_idx);
14819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_offset = bit_offset / 8;
14829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
14849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
14859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
14879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
14889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
14899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
14909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
14949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
14959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
14969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
14989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
14999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
15009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
15019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
15029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
15049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
15069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
15089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
15109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
15129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    bit_offset = interface_layout.getFieldOffset (child_idx);
15139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_offset = bit_offset / 8;
15149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
15169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
15179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
15189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
15199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
15209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
15219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
15229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
15239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
15249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
15269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
15279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetChildClangTypeAtIndex (ast_context,
15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 parent_name,
15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
15309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 idx,
15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 transparent_pointers,
15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 omit_empty_base_classes,
15339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 child_name,
15349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 child_byte_size,
15359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 child_byte_offset,
15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 child_bitfield_bit_size,
15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                 child_bitfield_bit_offset);
15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
15409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    char element_name[32];
155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_name.assign(element_name);
155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(field_type_info.first % 8 == 0);
155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_size = field_type_info.first / 8;
155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_offset = idx * child_byte_size;
155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return array->getElementType().getAsOpaquePtr();
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetChildClangTypeAtIndex (ast_context,
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_offset);
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetChildClangTypeAtIndex (ast_context,
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_offset);
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1620f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *clang_type,
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
19009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
19099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
19129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
19139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
19149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
19169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
19179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
19189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
19209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
19219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
19229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
19239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
19249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
19269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
19279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
19289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
19299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
19319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
19329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
19339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
19349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
19359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
19369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (GetIndexOfChildMemberWithName (ast_context,
19389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
19399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
19409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
19419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
19429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
19439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
19449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
19459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
19469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
19479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
19499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
19509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
19519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
19529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
19539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
19549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
19559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
19569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
19579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
19599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
19609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildMemberWithName (ast_context,
19619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
19629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
19639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
19649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
19659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
19669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
19679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
20041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
20051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildMemberWithName (ast_context,
205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *clang_type,
207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
20869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        clang::Type::TypeClass qual_type_class = qual_type->getTypeClass();
20889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        switch (qual_type_class)
209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
21349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
21359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
21369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
21379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
21389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
21399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
21409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
21419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
21429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
21439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
21459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
21469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
21479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
21489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
21509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
21519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
21529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
21549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
21559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
21569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
21579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
21589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
21609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
21619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
21629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
21649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
21659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
21669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
21679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
21689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
21699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
21709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
21719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
21729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
21749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
21759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildWithName (ast_context,
21769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
22171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
22181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildWithName (ast_context,
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTagTypeKind (void *tag_clang_type, int kind)
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
22871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = tag_qual_type.getTypePtr();
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(clang_type);
229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetDeclContextForType (void *clang_type)
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
23259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
23269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
23279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
23289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
23299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
23309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
23319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
23329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
23339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
23349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
23359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
23369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
23379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
23399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
23409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
23419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
23429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionDeclaration (const char *name, void *function_clang_type, int storage, bool is_inline)
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (&ast_context->Idents.get(name)),
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionType (void *result_type, void **args, unsigned num_args, bool isVariadic, unsigned TypeQuals)
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
241553d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        isVariadic,
241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        TypeQuals,
241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasExceptionSpec
242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasAnyExceptionSpec,
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // NumExs
242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // const QualType *ExArray
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        FunctionType::ExtInfo ()).getAsOpaquePtr();    // NoReturn);
242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
242784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateParmeterDeclaration (const char *name, void *return_type, int storage)
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ParmVarDecl::Create(*ast_context,
243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                ast_context->getTranslationUnitDecl(),
243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                name && name[0] ? &ast_context->Idents.get(name) : NULL,
243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                QualType::getFromOpaquePtr(return_type),
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateArrayType (void *element_type, size_t element_count, uint32_t bit_stride)
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::StartTagDeclarationDefinition (void *clang_type)
247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
24771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *t = qual_type.getTypePtr();
247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CompleteTagDeclarationDefinition (void *clang_type)
249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
25011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *t = qual_type.getTypePtr();
250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->completeDefinition();
251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name)
252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EnumDecl *enum_decl = EnumDecl::Create(*ast_context,
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           ast_context->getTranslationUnitDecl(),
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           SourceLocation(),
253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           name && name[0] ? &ast_context->Idents.get(name) : NULL,
253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           SourceLocation(),
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           NULL);
253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *enum_clang_type,
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *enumerator_clang_type,
254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = enum_qual_type.getTypePtr();
256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EnumConstantDecl::Create(*ast_context,
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_type->getDecl(),
257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             SourceLocation(),
257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             name ? &identifier_table->get(name) : NULL,    // Identifier
257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             QualType::getFromOpaquePtr(enumerator_clang_type),
257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             NULL,
257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_llvm_apsint);
257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreatePointerType (void *clang_type)
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
25977b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
25987b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
25997b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
26007b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        switch (qual_type->getTypeClass())
26017b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
26027b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
26037b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
26047b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        // TODO: find out if I need to make a pointer or objc pointer for "clang::Type::ObjCObjectPointer" types
26057b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        //case clang::Type::ObjCObjectPointer:
26067b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton            return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
26077b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
26087b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        // TODO: can we detect if this type is a block type?
26097b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton//      case clang::Type::BlockType:
26107b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton//          return getASTContext()->getBlockPointerType(qual_type).getAsOpaquePtr();
26117b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
26127b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
26137b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton            return getASTContext()->getPointerType(qual_type).getAsOpaquePtr();
26147b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
26157b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateLValueReferenceType (void *clang_type)
262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateRValueReferenceType (void *clang_type)
262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2635fa97069b86f30aa44bb23a1de506ae220359b4faGreg Claytonvoid *
263684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateMemberPointerType (void *clang_pointee_type, void *clang_class_type)
2637fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
2638fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
2639fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
2640fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
2641fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
2642fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
2643fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTypeSize(ast_context->VoidPtrTy);
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerOrReferenceType (void *clang_type, void **target_type)
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
26641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
26681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
26721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
26761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
26801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
26841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeBitSize (clang::ASTContext *ast_context, void *clang_type)
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypeSize(QualType::getFromOpaquePtr(clang_type));
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeBitAlign (clang::ASTContext *ast_context, void *clang_type)
270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypeAlign(QualType::getFromOpaquePtr(clang_type));
270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
270984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::IsIntegerType (void *clang_type, bool &is_signed)
271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerType (void *clang_type, void **target_type)
273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
27401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
27441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
27481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
27521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type);
275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsFloatingPointType (void *clang_type, uint32_t &count, bool &is_complex)
276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsCStringType (void *clang_type, uint32_t &length)
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr());
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType element_qual_type = array->getElementType();
28131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (canonical_type && canonical_type->isCharType())
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We know the size of the array and it could be a C string
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // since it is an array of characters
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = array->getSize().getLimitedValue();
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
28271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                clang::Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr();
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pointee_type_ptr)
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
28301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = 0; // No length info, read until a NULL terminator is received
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (canonical_type_ptr)
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return canonical_type_ptr->isCharType();
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type_ptr->isCharType();
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length);
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
28441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
28471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                clang::Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr();
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pointee_type_ptr)
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
28501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = 0; // No length info, read until a NULL terminator is received
285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (canonical_type_ptr)
285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return canonical_type_ptr->isCharType();
285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type_ptr->isCharType();
285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
286584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::IsArrayType (void *clang_type, void **member_type, uint64_t *size)
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
28801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
28861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
28911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateTypedefType (const char *name, void *clang_type, DeclContext *decl_ctx)
290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TypedefDecl *decl = TypedefDecl::Create(*ast_context,
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name ? &identifier_table->get(name) : NULL, // Identifier
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                ast_context->CreateTypeSourceInfo(qual_type));
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypedefType (decl).getAsOpaquePtr();
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeName (void *opaque_qual_type)
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_qual_type));
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const clang::TypedefDecl *typedef_decl = typedef_type->getDecl();
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, void *clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, void *clang_type, const char *s, uint8_t *dst, size_t dst_size)
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t bit_size = ast_context->getTypeSize (qual_type);
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3029