ClangASTContext.cpp revision ad60bf486dee699dd524225b63271ddc5b6329b9
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
37585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4284f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
43585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access)
4484f8075072eef306234f8109573067647735c111Greg Clayton{
4584f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
4684f8075072eef306234f8109573067647735c111Greg Clayton    {
47585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
48585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
49585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
50585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
51585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
5284f8075072eef306234f8109573067647735c111Greg Clayton    }
5384f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
5484f8075072eef306234f8109573067647735c111Greg Clayton}
5584f8075072eef306234f8109573067647735c111Greg Clayton
5684f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
57585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
5884f8075072eef306234f8109573067647735c111Greg Clayton{
5984f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
6084f8075072eef306234f8109573067647735c111Greg Clayton    {
61585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
62585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return ObjCIvarDecl::None;
63585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return ObjCIvarDecl::Public;
64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return ObjCIvarDecl::Private;
65585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return ObjCIvarDecl::Protected;
66585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPackage:   return ObjCIvarDecl::Package;
6784f8075072eef306234f8109573067647735c111Greg Clayton    }
6884f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
6984f8075072eef306234f8109573067647735c111Greg Clayton}
7084f8075072eef306234f8109573067647735c111Greg Clayton
7184f8075072eef306234f8109573067647735c111Greg Clayton
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
76e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
84e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
86e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
87e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
88e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
89e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
98e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
99e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(0 && "Invalid input kind!");
101e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
104e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
105e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
106e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
108e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
112e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
113e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
114e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.setVisibilityMode(LangOptions::Default);
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) :
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap(),
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap()
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_ast_context_ap.get() == NULL)
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_ast_context_ap.reset(
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            new ASTContext(
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getLanguageOptions(),
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSourceManager(),
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getTargetInfo(),
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getIdentifierTable(),
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSelectorTable(),
3106e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                *getBuiltinContext(),
3116e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                0));
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_ast_context_ap.get();
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
338e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
339e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
3561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic()));
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_diagnostic_ap.reset(new Diagnostic());
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
401462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
402585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
411462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
412462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size)
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!ast_context)
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
419585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->VoidPtrTy.getAsOpaquePtr();
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
424585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedCharTy.getAsOpaquePtr();
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedShortTy.getAsOpaquePtr();
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedIntTy.getAsOpaquePtr();
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongTy.getAsOpaquePtr();
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
439585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->CharTy.getAsOpaquePtr();
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->ShortTy.getAsOpaquePtr();
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->IntTy.getAsOpaquePtr();
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongTy.getAsOpaquePtr();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongLongTy.getAsOpaquePtr();
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->Int128Ty.getAsOpaquePtr();
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
454585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->FloatTy.getAsOpaquePtr();
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->DoubleTy.getAsOpaquePtr();
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongDoubleTy.getAsOpaquePtr();
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
463585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
471462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->VoidPtrTy.getAsOpaquePtr();
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->BoolTy.getAsOpaquePtr();
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatComplexTy.getAsOpaquePtr();
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleComplexTy.getAsOpaquePtr();
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatTy.getAsOpaquePtr();
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleTy.getAsOpaquePtr();
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleTy.getAsOpaquePtr();
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "int") ||
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed int"))
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->IntTy.getAsOpaquePtr();
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->Int128Ty.getAsOpaquePtr();
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "long int") ||
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "long long int") ||
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed long long"))
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongTy.getAsOpaquePtr();
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongLongTy.getAsOpaquePtr();
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "short") ||
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short int") ||
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed short") ||
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short signed int"))
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->ShortTy.getAsOpaquePtr();
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "char") ||
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed char"))
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->CharTy.getAsOpaquePtr();
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "wchar_t"))
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->WCharTy.getAsOpaquePtr();
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->ShortTy.getAsOpaquePtr();
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->IntTy.getAsOpaquePtr();
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongTy.getAsOpaquePtr();
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongLongTy.getAsOpaquePtr();
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->Int128Ty.getAsOpaquePtr();
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->SignedCharTy.getAsOpaquePtr();
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned int"))
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedIntTy.getAsOpaquePtr();
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned int") ||
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "long unsigned int") ||
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "unsigned long long"))
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongTy.getAsOpaquePtr();
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned short") ||
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short unsigned int"))
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedShortTy.getAsOpaquePtr();
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned char"))
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedCharTy.getAsOpaquePtr();
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongTy.getAsOpaquePtr();
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
660462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
661462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context)
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
663a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return ast_context->VoidTy.getAsOpaquePtr();
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
666462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
667960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
668960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
669960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    return getASTContext()->getObjCIdType().getAsOpaquePtr();
670960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
671960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
672462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
673960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
674960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
675960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    return getASTContext()->getObjCClassType().getAsOpaquePtr();
676960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
677960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
678462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
679960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    return getASTContext()->getObjCSelType().getAsOpaquePtr();
682960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
684462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
695462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
701462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
702462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const)
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType void_ptr_type(ast_context->VoidPtrTy);
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
712462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
713462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CopyType (ASTContext *dest_context,
714462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           ASTContext *source_context,
715462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Diagnostic diagnostics;
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileManager file_manager;
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTImporter importer(diagnostics,
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         *dest_context, file_manager,
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         *source_context, file_manager);
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type));
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ret.getAsOpaquePtr();
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7268d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
727462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context,
728462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
729462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
7305510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
7315510dddc33260a991284ef81ca343594f23262e8Sean Callanan    return ast_context->hasSameType(QualType::getFromOpaquePtr(type1),
7325510dddc33260a991284ef81ca343594f23262e8Sean Callanan                                    QualType::getFromOpaquePtr(type2));
7335510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
7345510dddc33260a991284ef81ca343594f23262e8Sean Callanan
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
737462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
738462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
749462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
750462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
761462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
762462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
775462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
776585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        decl_ctx = ast_context->getTranslationUnitDecl();
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
785585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
7869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
787306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
7889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
7899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
7909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
7919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name && name[0] ? &ast_context->Idents.get(name) : NULL);
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTagDeclType(decl).getAsOpaquePtr();
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
806dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
807dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
808dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
809dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
810dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
811dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
812dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (::strstr(name, "operator ") != name)
813dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
814dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
815dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    const char *post_op_name = name + 9;
816dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
817dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
818dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
819dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
820dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
821dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
822dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
823dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
824dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
825dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
826dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
827dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
828dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
829dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
830dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
831dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
832dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
833dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
834dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
835dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
836dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
837dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
838dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
839dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
840dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
841dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
842dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
843dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
844dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
845dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
846dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
847dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
848dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
849dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
850dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
851dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
852dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
853dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
854dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
855dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
856dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
857dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
858dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
859dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
860dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
861dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
862dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
863dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
864dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
865dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
866dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
867dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
868dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
869dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
870dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
871dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
872dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
873dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
874dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
875dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
876dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
877dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
878dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
879dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
886dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
887dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
888dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
889dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
890dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
891dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
892dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
893dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
894dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
895dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
896dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
897dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
898dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
899dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
900dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
901dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
902dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
903dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
904dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
905dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
913dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
914dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
915dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
916dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
918dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
919dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
927dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
928dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
997412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
998795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
999795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1000462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1001462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1002412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1003462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1004412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
10051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
10061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
100730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
100830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1009412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1010795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
10113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1012974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1013795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1014795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(ast_context);
1015795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1016795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
1017795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1018795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1019795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
10211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
10221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *clang_type(record_qual_type.getTypePtr());
1023795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type == NULL)
1025412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1026795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    RecordType *record_clang_type(dyn_cast<RecordType>(clang_type));
1028795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (record_clang_type == NULL)
1030412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1031795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    RecordDecl *record_decl = record_clang_type->getDecl();
1033795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (record_decl == NULL)
1035412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1036795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1037795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1038795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1040412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1041795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
10431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
104430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
10453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
104630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
104790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
104890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
104990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
10505325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
105190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
10525325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
105390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
105490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
10555325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
105630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
105790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
105890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
105990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
106090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
106190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
106290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
106390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
106490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast_context,
106590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
10665325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                     DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
106790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
106890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
106990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
107090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
107190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    else if (decl_name == record_decl->getDeclName())
107230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
107330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast_context,
107430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
10755325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                      DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
107630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
107730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
107830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
107930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
108030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
108130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
108230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
108390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1084dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1085dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1086dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
108790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1088dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1089dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1090dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast_context,
109190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1092dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
109390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
109490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1095dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1096dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1097dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_inline);
1098dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1099dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1100dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1101dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1102dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast_context,
1103dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
11045325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                             DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1105dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1106dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1107dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1108dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_explicit);
1109dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
111090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1111dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1112dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
111390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
111490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast_context,
111590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1116dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
111790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
111890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
111990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
112090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
112190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline);
112290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
112330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1124dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1125462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
112647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
11271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
11281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
112947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
11303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
11313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ParmVarDecl *params[num_params];
11333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
11353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
11363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
11373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
11381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        params[param_index] = ParmVarDecl::Create (*ast_context,
11391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   cxx_method_decl,
11401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
11411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
11421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
11431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
11441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
11451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
11461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL);
11473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setParams (params, num_params);
11503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
1152795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1153412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1154795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1155795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1156795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
115784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
115884f8075072eef306234f8109573067647735c111Greg Clayton(
1159462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1160462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
116184f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1162462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
116384f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
116484f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
116584f8075072eef306234f8109573067647735c111Greg Clayton)
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    clang::Type *clang_type = record_qual_type.getTypePtr();
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
119047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
119284f8075072eef306234f8109573067647735c111Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast_context,
119384f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
119484f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
119584f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
119684f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
119784f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
119884f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
119984f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120184f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
12099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
12109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
12119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
12129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
12131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
121460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                ClangASTContext::AddObjCClassIVar (ast_context,
121560a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
12169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
12179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
12189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
12199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
12201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
12219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
12229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context == NULL || field == NULL)
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1287462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type)
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
12921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = qual_type.getTypePtr();
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl *record_decl = record_type->getDecl();
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (record_decl)
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t field_idx;
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RecordDecl::field_iterator field, field_end;
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         field != field_end;
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++field, ++field_idx)
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // If no accessibility was assigned, assign the correct one
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            field->setAccess ((AccessSpecifier)default_accessibility);
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1320462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
13236e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
13246e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
13256e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
13266e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
13276e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)));
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1331e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1332e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1333e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1334e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1335e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1336e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1337e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1338e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1339e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1340e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1342462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cxx_record_decl->setBases(base_classes, num_base_classes);
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
136384f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
136484f8075072eef306234f8109573067647735c111Greg Clayton
1365462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
136684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
136784f8075072eef306234f8109573067647735c111Greg Clayton(
136884f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
136984f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
137084f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
137184f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
137284f8075072eef306234f8109573067647735c111Greg Clayton)
137384f8075072eef306234f8109573067647735c111Greg Clayton{
137484f8075072eef306234f8109573067647735c111Greg Clayton    ASTContext *ast_context = getASTContext();
137584f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
137684f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
137784f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
137884f8075072eef306234f8109573067647735c111Greg Clayton        decl_ctx = ast_context->getTranslationUnitDecl();
137984f8075072eef306234f8109573067647735c111Greg Clayton
138084f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
138184f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
138284f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
138384f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
138484f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
138584f8075072eef306234f8109573067647735c111Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context,
138684f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
138784f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
138884f8075072eef306234f8109573067647735c111Greg Clayton                                                         &ast_context->Idents.get(name),
138984f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
139084f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
139184f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
13929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
13939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr();
139484f8075072eef306234f8109573067647735c111Greg Clayton}
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139684f8075072eef306234f8109573067647735c111Greg Claytonbool
1397462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
139884f8075072eef306234f8109573067647735c111Greg Clayton{
139984f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
140084f8075072eef306234f8109573067647735c111Greg Clayton    {
140184f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
140284f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
140384f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *class_type = class_qual_type.getTypePtr();
140484f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *super_type = super_qual_type.getTypePtr();
140584f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
140684f8075072eef306234f8109573067647735c111Greg Clayton        {
140784f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
140884f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
140984f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
141084f8075072eef306234f8109573067647735c111Greg Clayton            {
141184f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
141284f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
141384f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
141484f8075072eef306234f8109573067647735c111Greg Clayton                {
141584f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
141684f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
141784f8075072eef306234f8109573067647735c111Greg Clayton                }
141884f8075072eef306234f8109573067647735c111Greg Clayton            }
141984f8075072eef306234f8109573067647735c111Greg Clayton        }
142084f8075072eef306234f8109573067647735c111Greg Clayton    }
142184f8075072eef306234f8109573067647735c111Greg Clayton    return false;
142284f8075072eef306234f8109573067647735c111Greg Clayton}
142384f8075072eef306234f8109573067647735c111Greg Clayton
142484f8075072eef306234f8109573067647735c111Greg Clayton
142584f8075072eef306234f8109573067647735c111Greg Claytonbool
142684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
142784f8075072eef306234f8109573067647735c111Greg Clayton(
1428462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1429462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
143084f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1431462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
143284f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
143384f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
14341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
143584f8075072eef306234f8109573067647735c111Greg Clayton)
143684f8075072eef306234f8109573067647735c111Greg Clayton{
143784f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
143884f8075072eef306234f8109573067647735c111Greg Clayton        return false;
143984f8075072eef306234f8109573067647735c111Greg Clayton
144060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
144184f8075072eef306234f8109573067647735c111Greg Clayton
144284f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
144384f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
144484f8075072eef306234f8109573067647735c111Greg Clayton
144584f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
144684f8075072eef306234f8109573067647735c111Greg Clayton
144784f8075072eef306234f8109573067647735c111Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
144884f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
144984f8075072eef306234f8109573067647735c111Greg Clayton    {
145084f8075072eef306234f8109573067647735c111Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
145184f8075072eef306234f8109573067647735c111Greg Clayton
145284f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
145384f8075072eef306234f8109573067647735c111Greg Clayton        {
145484f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
145584f8075072eef306234f8109573067647735c111Greg Clayton
145684f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
145784f8075072eef306234f8109573067647735c111Greg Clayton            {
145884f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
145984f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
146084f8075072eef306234f8109573067647735c111Greg Clayton                {
146184f8075072eef306234f8109573067647735c111Greg Clayton                    APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
146247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                    bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
146384f8075072eef306234f8109573067647735c111Greg Clayton                }
146484f8075072eef306234f8109573067647735c111Greg Clayton
14659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context,
14669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
14679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
14689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
14699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
14709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
14719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
14729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
14731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
14749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
14769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
14779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
14789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
14799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
148084f8075072eef306234f8109573067647735c111Greg Clayton            }
148184f8075072eef306234f8109573067647735c111Greg Clayton        }
148284f8075072eef306234f8109573067647735c111Greg Clayton    }
148384f8075072eef306234f8109573067647735c111Greg Clayton    return false;
148484f8075072eef306234f8109573067647735c111Greg Clayton}
148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14879488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1488462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
14899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
14909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
14939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
14949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
14959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
14969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
14989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
14999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
15009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
15019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
15029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15039488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
15049488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
15059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
15069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
15079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
15089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
15099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
15109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
15129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
15139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
15149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
15159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
15169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
15179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
15181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1519462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
15201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
15211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1522462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1523462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
15241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1525462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
15261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
15271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
15281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
15291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
15301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    IdentifierTable *identifier_table = &ast_context->Idents;
15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (ast_context != NULL);
15351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
15361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
15381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
15401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
15411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
15441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
15461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
15491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
15511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
15541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
15551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
15581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
15591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
15611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1562ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
15631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1564ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1565ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1566ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1567ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
15681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1569ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
15701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1571ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
1572ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        if (start[len] == ':')
1573ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        {
1574ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
1575ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            len += 1;
1576ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        }
1577ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        //printf ("@selector[%zu] = '%.*s'\n", selector_idents.size(), (int)len, start);
15781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
15791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
15801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
15831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
15841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1585ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
15861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
15871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
15891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
15911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *method_type(method_qual_type.getTypePtr());
15921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
15941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
15971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
15991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
16031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
16041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
16051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
16061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
16081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context,
16101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
16111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
16121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
16131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
16141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
16151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
16181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
16211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
16221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
16251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
16291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
16321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
16331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            params.push_back (ParmVarDecl::Create (*ast_context,
16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
16361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
16371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args);
16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
16469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1658462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type->isAggregateType ())
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
166903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
16721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
16731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
16741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
16751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
16761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
16779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
16789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
1692462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes)
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type == NULL)
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
16999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
17009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1702960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
1703960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
1704960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
1705960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCId:    // Child is Class
1706960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
1707960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCSel:   // child is const char *
1708960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
1709960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
1710960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
1711960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
1712960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
1713960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
1714960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
17151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
17579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
17589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
17599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
17609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
17619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
17629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
17639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
17649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
17669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
17679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
17699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
17709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
17719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
17729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
17739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
17749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
17759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
17769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
17779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
17789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
17799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
17819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
17829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
17839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
17849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
17859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
1787960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
1788960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
1789960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
1790960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
1791960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
1792960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
1793960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
1794960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
1795960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
1796960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
1797960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
1798960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
17999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
18001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            QualType pointee_type = pointer_type->getPointeeType();
18089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
18099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If this type points to a simple type, then it has 1 child
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = 1;
181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes);
182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1829462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
1833462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_offset
184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_offset);
185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1860462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
1865462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_offset
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
188503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
188603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1888960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
1889960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
1890960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
1891960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
1892960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
1893960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
1894960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
1895960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCSel:
1896960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
1897960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    QualType char_type(ast_context->CharTy);
1898960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    char_type.addConst();
1899960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    return ast_context->getPointerType(char_type).getAsOpaquePtr();
1900960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
1901960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
1902960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
1903960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
1904960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
1905960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
1906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
1907960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
1908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
19091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
192924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl);
194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bit_offset = record_layout.getBaseClassOffset(base_class_decl);
194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes biut sizes should be a multiple of 8 bits in size
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
198054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
19979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
19989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
19999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
20009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
20019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
20029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
20039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
20049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
20059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
20079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
20089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl);
20109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
20119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
20129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
20139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
20149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2015960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
20169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
20179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
20189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
20199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl));
20209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
20239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
20259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2027960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
20289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
20309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
20319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
20339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
20349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
20359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
20369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
20379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2038960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2039960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
20409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
20429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
20439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
20449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
20469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
20479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
20489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
20499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
20509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
20529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
20549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
20569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
20589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
2060960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                    bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
20619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_offset = bit_offset / 8;
20629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
20649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
20659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
20669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
20679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
20689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
20699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
20709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
20719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
20729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
20749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2075960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2076960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2077960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2078960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2079960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
2080960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    return GetChildClangTypeAtIndex (ast_context,
2081960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2082960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2083960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2084960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2085960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
2086960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2087960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2088960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2089960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2090960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_offset);
2091960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2092960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2093960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
2094960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2095960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2096960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2097960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2098960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2099960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2100960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2101960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2102960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2103960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
2104960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2105960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2106960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2107960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2108960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2109960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
21109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
21119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
21129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    char element_name[32];
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_name.assign(element_name);
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(field_type_info.first % 8 == 0);
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_size = field_type_info.first / 8;
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_offset = idx * child_byte_size;
212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return array->getElementType().getAsOpaquePtr();
213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetChildClangTypeAtIndex (ast_context,
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_offset);
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetChildClangTypeAtIndex (ast_context,
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_offset);
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2192f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
233424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
233524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
233824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
233924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
2373462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
238203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
238303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
24739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
24749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
24759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
24769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
24779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
24789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
24799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
24809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
24819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
24829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
24839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
24849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
24859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
24869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
24879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2488823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
24899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
24909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
24919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
24929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
24939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
24949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
24959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
24969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
24979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
24989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
24999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
25009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
25019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
25029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
25049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
25059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
25069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
25079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
25089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
25099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (GetIndexOfChildMemberWithName (ast_context,
25119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
25129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
25139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
25149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
25159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
25169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
25179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
25189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
25199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
25209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
25229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
25239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
25249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
25259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
25269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
25279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
25289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
25299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
25309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
25329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
25339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildMemberWithName (ast_context,
25349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
25359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
25369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
25379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
25389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
25399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
25409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
25421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
25771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
25781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildMemberWithName (ast_context,
263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
2651462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
26599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
266003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
26619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
266203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
27239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
27249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
27259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
27279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
27289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
27299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
27309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
27319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
27339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
27349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
27359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
27379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
27389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
27399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
27409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
27419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
27429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
27439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
27479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
27489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildWithName (ast_context,
27499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
27509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
27519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
27529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
27901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
27911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildWithName (ast_context,
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2855462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
28601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = tag_qual_type.getTypePtr();
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(clang_type);
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
2882462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
288803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
288903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
28919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
28929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
28939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
28949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
28959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
28969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
28979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
28989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
28999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
29009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
29019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
29029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
29039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
29049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
29059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
29069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
29079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
29089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
29099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
29109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
29119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
29139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
29149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
29159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
29169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
2943462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (&ast_context->Idents.get(name)),
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2978462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
2979462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context,
2980462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
2981462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
29822ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
29832ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
29842ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
299353d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
29952ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                        is_variadic,
29962ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                        type_quals,
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasExceptionSpec
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasAnyExceptionSpec,
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // NumExs
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // const QualType *ExArray
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        FunctionType::ExtInfo ()).getAsOpaquePtr();    // NoReturn);
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3005462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ParmVarDecl::Create(*ast_context,
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                ast_context->getTranslationUnitDecl(),
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                name && name[0] ? &ast_context->Idents.get(name) : NULL,
30132ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3030462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3031462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3050462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
30551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *t = qual_type.getTypePtr();
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3074462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
307955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
308055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
308155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
308255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
308455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
308555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
308655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
308755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
308855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
308955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
309055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
309155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
309255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
309355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
309455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
309555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
309755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
309855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
309955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
310055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
310155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
310255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), enum_decl->getIntegerType(), NumPositiveBits, NumNegativeBits);
310355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3113462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3114462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name, clang_type_t integer_qual_type)
311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EnumDecl *enum_decl = EnumDecl::Create(*ast_context,
312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           ast_context->getTranslationUnitDecl(),
312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           SourceLocation(),
312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           name && name[0] ? &ast_context->Idents.get(name) : NULL,
312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           SourceLocation(),
312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           NULL);
312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3127e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3128e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3129e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
3131e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3135462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3136462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3137462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3138462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3139462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3140462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang::Type *clang_type = enum_qual_type.getTypePtr();
3141462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3142462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3143462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3144462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3145462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3146462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3147462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3148462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3149462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3150462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3151462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3152462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3156462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3157462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = enum_qual_type.getTypePtr();
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EnumConstantDecl::Create(*ast_context,
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_type->getDecl(),
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             SourceLocation(),
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             name ? &identifier_table->get(name) : NULL,    // Identifier
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             QualType::getFromOpaquePtr(enumerator_clang_type),
319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             NULL,
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_llvm_apsint);
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3206462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3207462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
32107b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
32117b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
32127b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
321303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
321403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
32157b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
32167b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
32177b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
32187b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton            return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
32197b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
32207b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
32217b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton            return getASTContext()->getPointerType(qual_type).getAsOpaquePtr();
32227b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
32237b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3227462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3228462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateLValueReferenceType (clang_type_t clang_type)
322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3235462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3236462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateRValueReferenceType (clang_type_t clang_type)
323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3243462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3244462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
3245fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
3246fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
3247fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
3248fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
3249fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
3250fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
3251fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTypeSize(ast_context->VoidPtrTy);
325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3260462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
326603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
326703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
32931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3302462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3322462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
332703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
332803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
33341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
33381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
33421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
33461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type);
334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3356462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
3395462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
33961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
33971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
33981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
33991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
34001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
34011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
34021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
34031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
34041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
34051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
34061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
3407462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
34081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
34091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
34101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
34111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
34121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
34131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
34141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
34151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
34161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
34171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
34181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
34191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3422462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
342703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
342803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr());
343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType element_qual_type = array->getElementType();
34341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (canonical_type && canonical_type->isCharType())
343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We know the size of the array and it could be a C string
343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // since it is an array of characters
343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = array->getSize().getLimitedValue();
344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
34481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                clang::Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr();
344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pointee_type_ptr)
345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
34511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = 0; // No length info, read until a NULL terminator is received
345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (canonical_type_ptr)
345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return canonical_type_ptr->isCharType();
345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type_ptr->isCharType();
345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length);
346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
34651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
346724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
34681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                clang::Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr();
346924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pointee_type_ptr)
347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
34711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
347224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = 0; // No length info, read until a NULL terminator is received
347324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (canonical_type_ptr)
347424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return canonical_type_ptr->isCharType();
347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type_ptr->isCharType();
347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3486462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
348703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
348803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
348903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
349003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
349103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
349203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
349303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
349403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
349503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
349603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
349703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
349803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
349903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
350003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
350103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
350203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
350303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
350403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
350503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
350603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
350703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
350803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
350903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
351003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
351103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
351203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
351303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
351403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
351503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
351603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
351703e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
3518462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
352603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
35451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3558462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3559462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TypedefDecl *decl = TypedefDecl::Create(*ast_context,
357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name ? &identifier_table->get(name) : NULL, // Identifier
357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                ast_context->CreateTypeSourceInfo(qual_type));
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypedefType (decl).getAsOpaquePtr();
357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
3584462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3588462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type));
358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3590462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3593462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const TypedefDecl *typedef_decl = typedef_type->getDecl();
359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
3611462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
3646462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t bit_size = ast_context->getTypeSize (qual_type);
366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3683a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
3684a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
3685462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
3686a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
3687a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
3688a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
3689a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3690a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
3691a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
3692a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
3693