ClangASTContext.cpp revision 5510dddc33260a991284ef81ca343594f23262e8
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"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h"
30bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
35f05633b35544b5d095feb05680c8728be087e441Eli Friedman
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
44e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
52e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
54e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
55e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
56e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
57e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
66e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
67e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(0 && "Invalid input kind!");
69e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
72e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
73e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
74e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
75e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
76e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
79e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
80e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
81e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
82e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.setVisibilityMode(LangOptions::Default);
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
204e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) :
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap(),
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap()
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_ast_context_ap.get() == NULL)
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_ast_context_ap.reset(
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            new ASTContext(
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getLanguageOptions(),
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSourceManager(),
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getTargetInfo(),
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getIdentifierTable(),
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSelectorTable(),
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getBuiltinContext()));
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_ast_context_ap.get();
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
305e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
306e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSourceManager *
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_source_manager_ap.reset(new SourceManager(*getDiagnostic()));
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_diagnostic_ap.reset(new Diagnostic());
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, uint32_t bit_size)
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast_context, lldb::Encoding encoding, uint32_t bit_size)
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!ast_context)
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingInvalid:
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->VoidPtrTy.getAsOpaquePtr();
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingUint:
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedCharTy.getAsOpaquePtr();
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedShortTy.getAsOpaquePtr();
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedIntTy.getAsOpaquePtr();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongTy.getAsOpaquePtr();
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingSint:
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->CharTy.getAsOpaquePtr();
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->ShortTy.getAsOpaquePtr();
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->IntTy.getAsOpaquePtr();
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongTy.getAsOpaquePtr();
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongLongTy.getAsOpaquePtr();
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->Int128Ty.getAsOpaquePtr();
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingIEEE754:
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->FloatTy.getAsOpaquePtr();
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->DoubleTy.getAsOpaquePtr();
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongDoubleTy.getAsOpaquePtr();
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case lldb::eEncodingVector:
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context)
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->VoidPtrTy.getAsOpaquePtr();
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->BoolTy.getAsOpaquePtr();
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatComplexTy.getAsOpaquePtr();
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleComplexTy.getAsOpaquePtr();
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatTy.getAsOpaquePtr();
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleTy.getAsOpaquePtr();
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleTy.getAsOpaquePtr();
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "int") ||
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed int"))
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->IntTy.getAsOpaquePtr();
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->Int128Ty.getAsOpaquePtr();
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "long int") ||
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "long long int") ||
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed long long"))
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongTy.getAsOpaquePtr();
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongLongTy.getAsOpaquePtr();
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "short") ||
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short int") ||
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed short") ||
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short signed int"))
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->ShortTy.getAsOpaquePtr();
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "char") ||
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "signed char"))
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->CharTy.getAsOpaquePtr();
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "wchar_t"))
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->WCharTy.getAsOpaquePtr();
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->ShortTy.getAsOpaquePtr();
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->IntTy.getAsOpaquePtr();
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongTy.getAsOpaquePtr();
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongLongTy.getAsOpaquePtr();
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->Int128Ty.getAsOpaquePtr();
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->SignedCharTy.getAsOpaquePtr();
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned int"))
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedIntTy.getAsOpaquePtr();
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned int") ||
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "long unsigned int") ||
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "unsigned long long"))
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongTy.getAsOpaquePtr();
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned short") ||
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    streq(type_name, "short unsigned int"))
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedShortTy.getAsOpaquePtr();
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "unsigned char"))
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedCharTy.getAsOpaquePtr();
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongTy.getAsOpaquePtr();
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidBuiltInType()
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->VoidTy.getAsOpaquePtr();
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (clang::ASTContext *ast_context, bool is_const)
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType void_ptr_type(ast_context->VoidPtrTy);
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CopyType(clang::ASTContext *dest_context,
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          clang::ASTContext *source_context,
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                          void * clang_type)
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Diagnostic diagnostics;
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileManager file_manager;
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTImporter importer(diagnostics,
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         *dest_context, file_manager,
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         *source_context, file_manager);
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type));
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ret.getAsOpaquePtr();
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6755510dddc33260a991284ef81ca343594f23262e8Sean Callananstatic bool
6765510dddc33260a991284ef81ca343594f23262e8Sean CallananAreTypesSame(clang::ASTContext *ast_context,
6775510dddc33260a991284ef81ca343594f23262e8Sean Callanan             void *type1,
6785510dddc33260a991284ef81ca343594f23262e8Sean Callanan             void *type2)
6795510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
6805510dddc33260a991284ef81ca343594f23262e8Sean Callanan    return ast_context->hasSameType(QualType::getFromOpaquePtr(type1),
6815510dddc33260a991284ef81ca343594f23262e8Sean Callanan                                    QualType::getFromOpaquePtr(type2));
6825510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
6835510dddc33260a991284ef81ca343594f23262e8Sean Callanan
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddConstModifier (void *clang_type)
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddRestrictModifier (void *clang_type)
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddVolatileModifier (void *clang_type)
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx)
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        decl_ctx = ast_context->getTranslationUnitDecl();
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name && name[0] ? &ast_context->Idents.get(name) : NULL);
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTagDeclType(decl).getAsOpaquePtr();
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddFieldToRecordType (void * record_clang_type, const char *name, void * field_type, int access, uint32_t bitfield_bit_size)
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IdentifierTable *identifier_table = getIdentifierTable();
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *clang_type = record_qual_type.getTypePtr();
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                cxx_record_decl->setEmpty (false);
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bit_width = new (*ast_context)IntegerLiteral (bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            FieldDecl *field = FieldDecl::Create(*ast_context,
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                record_decl,
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name ? &identifier_table->get(name) : NULL, // Identifier
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                QualType::getFromOpaquePtr(field_type), // Field type
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                NULL,       // DeclaratorInfo *
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                bit_width,  // BitWidth
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                false);     // Mutable
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            field->setAccess((AccessSpecifier)access);
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context == NULL || field == NULL)
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetDefaultAccessForRecordFields (void *clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type)
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type *clang_type = qual_type.getTypePtr();
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl *record_decl = record_type->getDecl();
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (record_decl)
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t field_idx;
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RecordDecl::field_iterator field, field_end;
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         field != field_end;
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++field, ++field_idx)
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // If no accessibility was assigned, assign the correct one
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            field->setAccess ((AccessSpecifier)default_accessibility);
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateBaseClassSpecifier (void *base_class_type, int access, bool is_virtual, bool base_of_class)
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return new CXXBaseSpecifier(SourceRange(), is_virtual, base_of_class, (AccessSpecifier)access, QualType::getFromOpaquePtr(base_class_type));
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
901e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
902e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
903e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
904e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
905e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
906e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
907e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
908e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
909e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
910e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetBaseClassesForClassType (void *class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //cxx_record_decl->setEmpty (false);
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cxx_record_decl->setBases(base_classes, num_base_classes);
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsAggregateType (void *clang_type)
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type->isAggregateType ())
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::IncompleteArray:
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::VariableArray:
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ConstantArray:
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ExtVector:
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Vector:
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Record:
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Typedef:
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_classes)
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type == NULL)
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Record:
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ConstantArray:
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Pointer:
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            QualType pointee_type = pointer_type->getPointeeType();
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), omit_empty_base_classes);
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If this type points to a simple type, then it has 1 child
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = 1;
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Typedef:
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes);
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *parent_clang_type,
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_offset
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_offset);
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *parent_clang_type,
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_offset
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (parent_qual_type->getTypeClass())
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Record:
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl);
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bit_offset = record_layout.getBaseClassOffset(base_class_decl);
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes biut sizes should be a multiple of 8 bits in size
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
117754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::ConstantArray:
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    char element_name[32];
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_name.assign(element_name);
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(field_type_info.first % 8 == 0);
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_size = field_type_info.first / 8;
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_offset = idx * child_byte_size;
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return array->getElementType().getAsOpaquePtr();
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Pointer:
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetChildClangTypeAtIndex (ast_context,
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_offset);
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Typedef:
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetChildClangTypeAtIndex (ast_context,
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_offset);
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *clang_type,
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Record:
146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
146724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::ConstantArray:
155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case Type::MemberPointerType:
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::LValueReference:
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::RValueReference:
158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Pointer:
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Typedef:
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildMemberWithName (ast_context,
163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *clang_type,
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Record:
167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::ConstantArray:
171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case Type::MemberPointerType:
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::LValueReference:
174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::RValueReference:
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Pointer:
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Typedef:
179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildWithName (ast_context,
179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTagTypeKind (void *tag_clang_type, int kind)
181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type *clang_type = tag_qual_type.getTypePtr();
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(clang_type);
182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetDeclContextForType (void *clang_type)
184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::FunctionNoProto:         break;
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::FunctionProto:           break;
184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::IncompleteArray:         break;
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::VariableArray:           break;
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ConstantArray:           break;
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ExtVector:               break;
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Vector:                  break;
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Builtin:                 break;
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ObjCObjectPointer:       break;
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::BlockPointer:            break;
185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Pointer:                 break;
185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::LValueReference:         break;
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::RValueReference:         break;
186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::MemberPointer:           break;
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Complex:                 break;
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ObjCInterface:           break;
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Record:
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return cast<RecordType>(qual_type)->getDecl();
186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Enum:
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return cast<EnumType>(qual_type)->getDecl();
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Typedef:
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::TypeOfExpr:              break;
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::TypeOf:                  break;
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Decltype:                break;
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //case Type::QualifiedName:           break;
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::TemplateSpecialization:  break;
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionDeclaration (const char *name, void *function_clang_type, int storage, bool is_inline)
190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (&ast_context->Idents.get(name)),
191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
192924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionType (void *result_type, void **args, unsigned num_args, bool isVariadic, unsigned TypeQuals)
193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.data(),
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        isVariadic,
195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        TypeQuals,
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasExceptionSpec
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasAnyExceptionSpec,
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // NumExs
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // const QualType *ExArray
195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        FunctionType::ExtInfo ()).getAsOpaquePtr();    // NoReturn);
195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateParmeterDeclaration (const char *name, void * return_type, int storage)
196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ParmVarDecl::Create(*ast_context,
196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                ast_context->getTranslationUnitDecl(),
196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                name && name[0] ? &ast_context->Idents.get(name) : NULL,
196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                QualType::getFromOpaquePtr(return_type),
196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateArrayType (void *element_type, size_t element_count, uint32_t bit_stride)
198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::StartTagDeclarationDefinition (void *clang_type)
200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type *t = qual_type.getTypePtr();
201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CompleteTagDeclarationDefinition (void *clang_type)
202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type *t = qual_type.getTypePtr();
203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->completeDefinition();
204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name)
205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EnumDecl *enum_decl = EnumDecl::Create(*ast_context,
206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           ast_context->getTranslationUnitDecl(),
206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           SourceLocation(),
206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           name && name[0] ? &ast_context->Idents.get(name) : NULL,
206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           SourceLocation(),
206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           NULL);
206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *enum_clang_type,
207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *enumerator_clang_type,
207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Type *clang_type = enum_qual_type.getTypePtr();
209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EnumConstantDecl::Create(*ast_context,
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_type->getDecl(),
210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             SourceLocation(),
210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             name ? &identifier_table->get(name) : NULL,    // Identifier
210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             QualType::getFromOpaquePtr(enumerator_clang_type),
210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             NULL,
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_llvm_apsint);
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreatePointerType (void *clang_type)
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getPointerType(QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateLValueReferenceType (void *clang_type)
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateRValueReferenceType (void *clang_type)
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2149fa97069b86f30aa44bb23a1de506ae220359b4faGreg Claytonvoid *
2150fa97069b86f30aa44bb23a1de506ae220359b4faGreg ClaytonClangASTContext::CreateMemberPointerType (void * clang_pointee_type, void * clang_class_type)
2151fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
2152fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
2153fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
2154fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
2155fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
2156fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
2157fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTypeSize(ast_context->VoidPtrTy);
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerOrReferenceType (void *clang_type, void **target_type)
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ObjCObjectPointer:
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::BlockPointer:
217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Pointer:
218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::MemberPointer:
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::LValueReference:
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::RValueReference:
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::Typedef:
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeBitSize (clang::ASTContext *ast_context, void *clang_type)
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypeSize(QualType::getFromOpaquePtr(clang_type));
221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeBitAlign (clang::ASTContext *ast_context, void *clang_type)
221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypeAlign(QualType::getFromOpaquePtr(clang_type));
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsIntegerType (void * clang_type, bool &is_signed)
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerType (void *clang_type, void **target_type)
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::ObjCObjectPointer:
225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::BlockPointer:
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Pointer:
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::MemberPointer:
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Typedef:
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type);
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsFloatingPointType (void *clang_type, uint32_t &count, bool &is_complex)
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsCStringType (void *clang_type, uint32_t &length)
231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (qual_type->getTypeClass())
232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::ConstantArray:
232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr());
232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType element_qual_type = array->getElementType();
232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (canonical_type && canonical_type->isCharType())
232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We know the size of the array and it could be a C string
233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // since it is an array of characters
233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = array->getSize().getLimitedValue();
233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
233424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
233524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
233824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Pointer:
233924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr();
234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pointee_type_ptr)
234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = 0; // No length info, read until a NULL terminator is received
234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (canonical_type_ptr)
234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return canonical_type_ptr->isCharType();
234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type_ptr->isCharType();
235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::Typedef:
235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length);
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::LValueReference:
235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case Type::RValueReference:
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr();
236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (pointee_type_ptr)
236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    length = 0; // No length info, read until a NULL terminator is received
236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (canonical_type_ptr)
236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return canonical_type_ptr->isCharType();
236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type_ptr->isCharType();
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsArrayType (void * clang_type, void **member_type, uint64_t *size)
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (qual_type->getTypeClass())
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::ConstantArray:
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::IncompleteArray:
239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::VariableArray:
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case Type::DependentSizedArray:
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid *
241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateTypedefType (const char *name, void *clang_type, DeclContext *decl_ctx)
242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TypedefDecl *decl = TypedefDecl::Create(*ast_context,
243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name ? &identifier_table->get(name) : NULL, // Identifier
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                ast_context->CreateTypeSourceInfo(qual_type));
243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypedefType (decl).getAsOpaquePtr();
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeName (void *opaque_qual_type)
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_qual_type));
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const clang::TypedefDecl *typedef_decl = typedef_type->getDecl();
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, void *clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, void *clang_type, const char *s, uint8_t *dst, size_t dst_size)
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t bit_size = ast_context->getTypeSize (qual_type);
252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2543