ClangASTContext.cpp revision a91dd997b1e809c67901b7ac481942cacae19150
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include "lldb/Symbol/ClangASTContext.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
17bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#define NDEBUG
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTImporter.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/CXXInheritance.h"
2184f8075072eef306234f8109573067647735c111Greg Clayton#include "clang/AST/DeclObjC.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h"
268a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan#include "clang/Basic/FileSystemOptions.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h"
32bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
35f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h"
36839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
39f05633b35544b5d095feb05680c8728be087e441Eli Friedman
40585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4584f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier
46585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access)
4784f8075072eef306234f8109573067647735c111Greg Clayton{
4884f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
4984f8075072eef306234f8109573067647735c111Greg Clayton    {
50585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
51585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
52585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
53585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
54585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
5584f8075072eef306234f8109573067647735c111Greg Clayton    }
5684f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
5784f8075072eef306234f8109573067647735c111Greg Clayton}
5884f8075072eef306234f8109573067647735c111Greg Clayton
5984f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl
60585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access)
6184f8075072eef306234f8109573067647735c111Greg Clayton{
6284f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
6384f8075072eef306234f8109573067647735c111Greg Clayton    {
64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
65585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return ObjCIvarDecl::None;
66585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return ObjCIvarDecl::Public;
67585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return ObjCIvarDecl::Private;
68585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return ObjCIvarDecl::Protected;
69585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPackage:   return ObjCIvarDecl::Package;
7084f8075072eef306234f8109573067647735c111Greg Clayton    }
7184f8075072eef306234f8109573067647735c111Greg Clayton    return ObjCIvarDecl::None;
7284f8075072eef306234f8109573067647735c111Greg Clayton}
7384f8075072eef306234f8109573067647735c111Greg Clayton
7484f8075072eef306234f8109573067647735c111Greg Clayton
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
79e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
87e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
89e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
90e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
91e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
92e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
101e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
102e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(0 && "Invalid input kind!");
104e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
108e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
109e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
110e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
114e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
115e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
116e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
117e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.BCPLComment = Std.hasBCPLComments();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
1658950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan        Opts.setVisibilityMode(DefaultVisibility);
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.NoInline = !Opt;
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) :
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap(),
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap(),
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap(),
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap()
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_triple.assign (target_triple);
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_ast_context_ap.reset();
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_diagnostic_ap.reset();
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_options_ap.reset();
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_ast_context_ap.get() == NULL)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_ast_context_ap.reset(
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            new ASTContext(
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getLanguageOptions(),
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSourceManager(),
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getTargetInfo(),
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getIdentifierTable(),
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *getSelectorTable(),
3136e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                *getBuiltinContext(),
3146e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                0));
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_ast_context_ap.get();
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
341e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
342e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3558a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
3568a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
3578a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
3588a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
3598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan        m_file_manager_ap.reset(new clang::FileManager());
3608a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
3618a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
3628a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
3638a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileSystemOptions *
3648a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileSystemOptions()
3658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
3668a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_system_options_ap.get() == NULL)
3678a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan        m_file_system_options_ap.reset(new clang::FileSystemOptions());
3688a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_system_options_ap.get();
3698a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
3708a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
3711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
3758a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager(), *getFileSystemOptions()));
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_diagnostic_ap.reset(new Diagnostic());
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
420462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
421585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
430462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
431462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size)
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!ast_context)
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
438585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->VoidPtrTy.getAsOpaquePtr();
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
443585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedCharTy.getAsOpaquePtr();
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedShortTy.getAsOpaquePtr();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedIntTy.getAsOpaquePtr();
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongTy.getAsOpaquePtr();
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
458585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->CharTy.getAsOpaquePtr();
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->ShortTy.getAsOpaquePtr();
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->IntTy.getAsOpaquePtr();
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongTy.getAsOpaquePtr();
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongLongTy.getAsOpaquePtr();
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->Int128Ty.getAsOpaquePtr();
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
473585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->FloatTy.getAsOpaquePtr();
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->DoubleTy.getAsOpaquePtr();
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongDoubleTy.getAsOpaquePtr();
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
482585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
490462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context)
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->VoidPtrTy.getAsOpaquePtr();
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->BoolTy.getAsOpaquePtr();
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatComplexTy.getAsOpaquePtr();
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleComplexTy.getAsOpaquePtr();
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatTy.getAsOpaquePtr();
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleTy.getAsOpaquePtr();
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleTy.getAsOpaquePtr();
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
5418ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
5438ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
5448ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->LongLongTy.getAsOpaquePtr();
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
5468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongTy.getAsOpaquePtr();
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
5518ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->ShortTy.getAsOpaquePtr();
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
5568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->CharTy.getAsOpaquePtr();
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
5638ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
5648ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
5658ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
5668ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->IntTy.getAsOpaquePtr();
5678ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
5688ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->Int128Ty.getAsOpaquePtr();
5698ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
5708ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (streq(type_name, "wchar_t"))
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->WCharTy.getAsOpaquePtr();
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->ShortTy.getAsOpaquePtr();
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->IntTy.getAsOpaquePtr();
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongTy.getAsOpaquePtr();
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongLongTy.getAsOpaquePtr();
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->Int128Ty.getAsOpaquePtr();
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->SignedCharTy.getAsOpaquePtr();
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
6098ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
6118ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
6128ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6148ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongTy.getAsOpaquePtr();
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6198ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedShortTy.getAsOpaquePtr();
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedCharTy.getAsOpaquePtr();
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
6308ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
6318ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
6328ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->UnsignedIntTy.getAsOpaquePtr();
6338ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
6348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
6358ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongTy.getAsOpaquePtr();
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
667462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
668462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context)
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
670a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return ast_context->VoidTy.getAsOpaquePtr();
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
673462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
674a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool()
675a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{
676a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan    return getASTContext()->BoolTy.getAsOpaquePtr();
677a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan}
678a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
679a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t
680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
68204325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinIdTy.getAsOpaquePtr();
683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
684960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
685462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
686960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
687960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
68804325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
689960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
690960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
691462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
692960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
693960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
69404325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinSelTy.getAsOpaquePtr();
695960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
696960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
697462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
708462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
714462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
715462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const)
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType void_ptr_type(ast_context->VoidPtrTy);
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
725839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananclass NullDiagnosticClient : public DiagnosticClient
726839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan{
727839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananpublic:
728839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    NullDiagnosticClient ()
729839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    {
730839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
731839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    }
732839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan
733839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
734839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    {
735839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan        if (m_log)
736839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan        {
737839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan            llvm::SmallVectorImpl<char> diag_str(10);
738839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan            info.FormatDiagnostic(diag_str);
739839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan            diag_str.push_back('\0');
740839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
741839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan        }
742839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    }
743839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananprivate:
744e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP m_log;
745839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan};
746839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan
747462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
748462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CopyType (ASTContext *dest_context,
749462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           ASTContext *source_context,
750462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
752ad5b61b871bace8dd7b28862662ed7f165d47267Sean Callanan    // null_client's ownership is transferred to diagnostics
753839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    NullDiagnosticClient *null_client = new NullDiagnosticClient;
754839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan    Diagnostic diagnostics(null_client);
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileManager file_manager;
7568a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTImporter importer(diagnostics,
7588a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                         *dest_context, file_manager, file_system_options,
7598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                         *source_context, file_manager, file_system_options);
760cf18faaf72090a68480145ca206955d792633559Sean Callanan
761cf18faaf72090a68480145ca206955d792633559Sean Callanan    QualType src = QualType::getFromOpaquePtr(clang_type);
762cf18faaf72090a68480145ca206955d792633559Sean Callanan    QualType dst = importer.Import(src);
763cf18faaf72090a68480145ca206955d792633559Sean Callanan
764cf18faaf72090a68480145ca206955d792633559Sean Callanan    return dst.getAsOpaquePtr();
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7676916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
7686916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
7696916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangASTContext::CopyDecl (ASTContext *dest_context,
7706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           ASTContext *source_context,
7716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
7726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
7736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // null_client's ownership is transferred to diagnostics
7746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    NullDiagnosticClient *null_client = new NullDiagnosticClient;
7756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    Diagnostic diagnostics(null_client);
7766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    FileManager file_manager;
7778a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
7786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    ASTImporter importer(diagnostics,
7798a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                         *dest_context, file_manager, file_system_options,
7808a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                         *source_context, file_manager, file_system_options);
7816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
7826916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
7836916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
7846916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
7858d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
786462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context,
787462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
788462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
7895510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
7905510dddc33260a991284ef81ca343594f23262e8Sean Callanan    return ast_context->hasSameType(QualType::getFromOpaquePtr(type1),
7915510dddc33260a991284ef81ca343594f23262e8Sean Callanan                                    QualType::getFromOpaquePtr(type2));
7925510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
7935510dddc33260a991284ef81ca343594f23262e8Sean Callanan
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
796462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
797462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
808462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
809462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
820462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
821462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
834462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
835585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
83904325065a00f646527db85e9bc751da29ac53b23Sean Callanan
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        decl_ctx = ast_context->getTranslationUnitDecl();
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
844585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
8459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
846306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
8479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
8489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
8499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
8509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name && name[0] ? &ast_context->Idents.get(name) : NULL);
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTagDeclType(decl).getAsOpaquePtr();
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
865dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
866dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
867dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
868dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
869dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
870dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
871dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (::strstr(name, "operator ") != name)
872dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
873dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
874dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    const char *post_op_name = name + 9;
875dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
876dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
877dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
878dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
879dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
886dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
887dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
888dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
889dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
890dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
891dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
892dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
893dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
894dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
895dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
896dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
897dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
898dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
899dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
900dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
901dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
902dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
903dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
904dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
905dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
913dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
914dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
915dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
916dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
918dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
919dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
927dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
928dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
997dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
998dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
999dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1000dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1001dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1002dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1003dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1004dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1005dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1006dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1007dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1008dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1009dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1010dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1011dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1012dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1013dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1014dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1015dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1016dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1017dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1018dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1019dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1020dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1021dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1022dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1023dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1024dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1025dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1026dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1027dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1028dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1029dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1030dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1031dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1032dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1033dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1034dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1035dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1036dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1037dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1038dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1039dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1040dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1041dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1042dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1043dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1044dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1045dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1046dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1047dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1048dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1049dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1050dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1051dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1052dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1053dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1054dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1055dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1056412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
1057795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
1058795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1059462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1060462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1061412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1062462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1063412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
10641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
10651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
106630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
106730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1068412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1069795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1071974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1072795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1073795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(ast_context);
1074795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1075795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
1076795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1077795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1078795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
10801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
10811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *clang_type(record_qual_type.getTypePtr());
1082795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type == NULL)
1084412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1085795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    RecordType *record_clang_type(dyn_cast<RecordType>(clang_type));
1087795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (record_clang_type == NULL)
1089412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1090795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    RecordDecl *record_decl = record_clang_type->getDecl();
1092795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (record_decl == NULL)
1094412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1095795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1096795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1097795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
10981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1099412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1100795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
11021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
110330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
110530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
110690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
110790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
110890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
11095325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
111090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
11115325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
111290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
111390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
11145325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
111530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
111690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
111790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
111890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
111990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
112090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
112190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
112290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
112390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast_context,
112490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
11255325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                     DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
112690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
11278950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                                     NULL,
112890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
112990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
113090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
113190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    else if (decl_name == record_decl->getDeclName())
113230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
113330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast_context,
113430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
11355325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                      DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
113630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
113730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
113830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
113930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
114030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
114130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
114230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
114390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1144dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1145dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1146dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
114790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1148dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1149dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast_context,
115190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1152dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
115390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
115490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1155dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1156dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1157dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_inline);
1158dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast_context,
1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
11645325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                             DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1165dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1166dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1167dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1168dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_explicit);
1169dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
117090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1171dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1172dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
117390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
117490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast_context,
117590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
117790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
117890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
117990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
118090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
118190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline);
118290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
118330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1185462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
118647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
11871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
11881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
118947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
11903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
11913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ParmVarDecl *params[num_params];
11933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
11953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
11963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
11973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
11981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        params[param_index] = ParmVarDecl::Create (*ast_context,
11991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   cxx_method_decl,
12001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
12011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
12021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
12031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
12041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
12051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
12061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL);
12073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setParams (params, num_params);
12103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
1212795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1213412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1214795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1215795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1216795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
121784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
121884f8075072eef306234f8109573067647735c111Greg Clayton(
1219462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1220462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
122184f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1222462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
122384f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
122484f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
122584f8075072eef306234f8109573067647735c111Greg Clayton)
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    clang::Type *clang_type = record_qual_type.getTypePtr();
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
125047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
125284f8075072eef306234f8109573067647735c111Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast_context,
125384f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
125484f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
125584f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
125684f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
125784f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
125884f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
125984f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126184f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
12699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
12709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
12719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
12729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
12731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
127460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                ClangASTContext::AddObjCClassIVar (ast_context,
127560a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
12769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
12779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
12789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
12799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
12801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
12819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
12829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context == NULL || field == NULL)
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1347462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type)
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
13521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = qual_type.getTypePtr();
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl *record_decl = record_type->getDecl();
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (record_decl)
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t field_idx;
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RecordDecl::field_iterator field, field_end;
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         field != field_end;
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++field, ++field_idx)
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // If no accessibility was assigned, assign the correct one
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            field->setAccess ((AccessSpecifier)default_accessibility);
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1380462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
13836e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
13846e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
13856e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
13866e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
13876e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)));
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1391e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1392e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1393e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1394e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1395e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1396e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1397e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1398e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1399e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1400e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1402462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cxx_record_decl->setBases(base_classes, num_base_classes);
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
142384f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
142484f8075072eef306234f8109573067647735c111Greg Clayton
1425462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
142684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
142784f8075072eef306234f8109573067647735c111Greg Clayton(
142884f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
142984f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
143084f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
143184f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
143284f8075072eef306234f8109573067647735c111Greg Clayton)
143384f8075072eef306234f8109573067647735c111Greg Clayton{
143484f8075072eef306234f8109573067647735c111Greg Clayton    ASTContext *ast_context = getASTContext();
143584f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
143684f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
143784f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
143884f8075072eef306234f8109573067647735c111Greg Clayton        decl_ctx = ast_context->getTranslationUnitDecl();
143984f8075072eef306234f8109573067647735c111Greg Clayton
144084f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
144184f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
144284f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
144384f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
144484f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
144584f8075072eef306234f8109573067647735c111Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context,
144684f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
144784f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
144884f8075072eef306234f8109573067647735c111Greg Clayton                                                         &ast_context->Idents.get(name),
144984f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
145084f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
145184f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
14529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr();
145484f8075072eef306234f8109573067647735c111Greg Clayton}
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145684f8075072eef306234f8109573067647735c111Greg Claytonbool
1457462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
145884f8075072eef306234f8109573067647735c111Greg Clayton{
145984f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
146084f8075072eef306234f8109573067647735c111Greg Clayton    {
146184f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
146284f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
146384f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *class_type = class_qual_type.getTypePtr();
146484f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *super_type = super_qual_type.getTypePtr();
146584f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
146684f8075072eef306234f8109573067647735c111Greg Clayton        {
146784f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
146884f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
146984f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
147084f8075072eef306234f8109573067647735c111Greg Clayton            {
147184f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
147284f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
147384f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
147484f8075072eef306234f8109573067647735c111Greg Clayton                {
147584f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
147684f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
147784f8075072eef306234f8109573067647735c111Greg Clayton                }
147884f8075072eef306234f8109573067647735c111Greg Clayton            }
147984f8075072eef306234f8109573067647735c111Greg Clayton        }
148084f8075072eef306234f8109573067647735c111Greg Clayton    }
148184f8075072eef306234f8109573067647735c111Greg Clayton    return false;
148284f8075072eef306234f8109573067647735c111Greg Clayton}
148384f8075072eef306234f8109573067647735c111Greg Clayton
148484f8075072eef306234f8109573067647735c111Greg Clayton
148584f8075072eef306234f8109573067647735c111Greg Claytonbool
148684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
148784f8075072eef306234f8109573067647735c111Greg Clayton(
1488462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1489462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
149084f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1491462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
149284f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
149384f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
14941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
149584f8075072eef306234f8109573067647735c111Greg Clayton)
149684f8075072eef306234f8109573067647735c111Greg Clayton{
149784f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
149884f8075072eef306234f8109573067647735c111Greg Clayton        return false;
149984f8075072eef306234f8109573067647735c111Greg Clayton
150060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
150184f8075072eef306234f8109573067647735c111Greg Clayton
150284f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
150384f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
150484f8075072eef306234f8109573067647735c111Greg Clayton
150584f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
150684f8075072eef306234f8109573067647735c111Greg Clayton
150784f8075072eef306234f8109573067647735c111Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
150884f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
150984f8075072eef306234f8109573067647735c111Greg Clayton    {
151084f8075072eef306234f8109573067647735c111Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
151184f8075072eef306234f8109573067647735c111Greg Clayton
151284f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
151384f8075072eef306234f8109573067647735c111Greg Clayton        {
151484f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
151584f8075072eef306234f8109573067647735c111Greg Clayton
151684f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
151784f8075072eef306234f8109573067647735c111Greg Clayton            {
151884f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
151984f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
152084f8075072eef306234f8109573067647735c111Greg Clayton                {
152184f8075072eef306234f8109573067647735c111Greg Clayton                    APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
152247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                    bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
152384f8075072eef306234f8109573067647735c111Greg Clayton                }
152484f8075072eef306234f8109573067647735c111Greg Clayton
15259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context,
15269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
15279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
15309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
15349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
154084f8075072eef306234f8109573067647735c111Greg Clayton            }
154184f8075072eef306234f8109573067647735c111Greg Clayton        }
154284f8075072eef306234f8109573067647735c111Greg Clayton    }
154384f8075072eef306234f8109573067647735c111Greg Clayton    return false;
154484f8075072eef306234f8109573067647735c111Greg Clayton}
154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15479488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1548462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
15499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
15509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
15519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
15539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
15549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
15559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
15569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
15589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
15599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
15609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
15619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
15629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15639488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
15649488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
15659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
15669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
15679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
15689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
15699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
15709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
15729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
15769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
15781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1579462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
15801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
15811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1582462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1583462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
15841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1585462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
15861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
15871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
15881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
15891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
15901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
15911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    IdentifierTable *identifier_table = &ast_context->Idents;
15931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (ast_context != NULL);
15951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
15961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
15981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
15991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
16001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
16011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
16041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
16061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
16091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
16111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
16141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
16151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
16181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
16211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1622ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1624ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1625ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1626ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1627ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1629ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1631ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
16326bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        bool has_arg = (start[len] == ':');
16336bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
1634ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
16366bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
16376bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton            len += 1;
16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1644ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
16461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *method_type(method_qual_type.getTypePtr());
16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
16561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
16581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
16621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
16631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
16641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
16651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
16671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context,
16691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
16701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
16711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
16721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
16731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
16741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
16751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
16761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
16771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
16781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
16791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
16801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
16811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
16841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
16871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
16881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
16891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
16911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
16921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            params.push_back (ParmVarDecl::Create (*ast_context,
16931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
16941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
16951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
16961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
16971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
16981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
16991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
17001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
17011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
17021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args);
17041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
17059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
17071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
17101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
17111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1713bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t
1714f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo
1715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton(
1716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type,
1717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang::ASTContext *ast_context,
1718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t *pointee_or_element_clang_type
1719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton)
1720bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
1721bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type == NULL)
1722f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return 0;
1723f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1724f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type)
1725f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        *pointee_or_element_clang_type = NULL;
1726bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1727bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1728bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1729bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1730bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    switch (type_class)
1731bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
173204325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
173304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
173404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
173504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
173604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
1737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (ast_context && pointee_or_element_clang_type)
1738f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                *pointee_or_element_clang_type = ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
173904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
1740f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        default:
1742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
174304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
174404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return eTypeIsBuiltIn | eTypeHasValue;
1745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::BlockPointer:
1747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
1750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1751bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Complex:                          return eTypeHasChildren | eTypeIsBuiltIn | eTypeHasValue;
1752f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ConstantArray:
1754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::DependentSizedArray:
1755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::IncompleteArray:
1756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::VariableArray:
1757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
1759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsArray;
1760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1761bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentName:                    return 0;
1762bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
1763bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
1764bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Decltype:                         return 0;
1765f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1766f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Enum:
1767f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1768f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
1769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsEnumeration | eTypeHasValue;
1770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1771bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Elaborated:                       return 0;
1772bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
1773bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
1774bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
1775bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::InjectedClassName:                return 0;
1776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1777f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
1778f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
1779f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1780f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
1781f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
1782f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1783bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
1784f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1785f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ObjCObjectPointer:
1786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
1789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
1791bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
1792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Pointer:
1794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
1797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1798bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Record:
1799bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (qual_type->getAsCXXRecordDecl())
1800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
1801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        else
1802bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsStructUnion;
1803bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        break;
1804bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
1805bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
1806bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
1807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Typedef:
1809f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
1810f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  ast_context,
1811f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  pointee_or_element_clang_type);
1812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1813bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOfExpr:                       return 0;
1814bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOf:                           return 0;
1815bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::UnresolvedUsing:                  return 0;
1816bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
1817bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    default:                                            return 0;
1818bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1819bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return 0;
1820bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1821bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1826462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
183403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
18371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
18381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
18391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
18401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
18411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
18429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
18439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
1857462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes)
185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type == NULL)
186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
18659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1867960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
1868960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
1869960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
1870f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::BuiltinType::ObjCId:    // child is Class
1871960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
1872960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
1873f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
1874960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
1875960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
1876960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
1877960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
1878960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
1879960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
18801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
188153d287bda5182511685a1dc7961a54b30bf3eedcGreg Clayton        if (ClangASTType::IsDefined (clang_qual_type))
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
19239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
19249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
19259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
19269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
19279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
19289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
19299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
19309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
19329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
19339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
19359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
19369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
19379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
19389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
19399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
19409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
19419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
19429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
19439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
19449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
19459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
19479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
19489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
19499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
19509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
19519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
1953960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
1954960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
1955960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
1956960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
1957960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
1958960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
1959960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
1960960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
1961960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
1962960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
1963960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
1964960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
19659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            QualType pointee_type = pointer_type->getPointeeType();
19749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
19759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If this type points to a simple type, then it has 1 child
197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = 1;
197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1984f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
1985f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
1986f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1987f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
1988f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
1989f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
1990f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                             omit_empty_base_classes);
1991f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            // If this type points to a simple type, then it has 1 child
1992f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (num_pointee_children == 0)
1993f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = 1;
1994f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
1995f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = num_pointee_children;
1996f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1997f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1998f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1999f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
20001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes);
200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2011462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2015462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2023bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
2024bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool &child_is_base_class
202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
2039bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_bitfield_bit_offset,
2040bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_is_base_class);
204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2044462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2049462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2057bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
2058bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool &child_is_base_class
205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
2069bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        child_is_base_class = false;
207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
207103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
207203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2074960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
2075960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2076960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
2077960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
2078960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
207904325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_name = "isa";
208004325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_byte_size = ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / CHAR_BIT;
2081960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
2082960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2083960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
2084960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
2085960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
2086960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2087960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2088960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
20891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
21238a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity();
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
21258a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity();
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes biut sizes should be a multiple of 8 bits in size
213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
2139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            child_is_base_class = true;
214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
216154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
21829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
21839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
21849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
21859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
21869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
21889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
21899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
21909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl);
21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
21929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
21939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
21949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
21959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2196960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
21979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
21989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl));
22019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
22049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
22069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2208960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
2209bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                        child_is_base_class = true;
22109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
22139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
22159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
22169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
22179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
22189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2220960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2221960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
22229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
22249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
22259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
22269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
22289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
22299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
22309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
22319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
22329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
22349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
22369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
22389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
22409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
2242960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                    bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
22439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_offset = bit_offset / 8;
22449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
22469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
22479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
22489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
22499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
22509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
22519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
22529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
22539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
22549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
22569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2257960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2258960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2259960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2260960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2261960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
2262960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    return GetChildClangTypeAtIndex (ast_context,
2263960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2264960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2265960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2266960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2267960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
2268960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2269960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2270960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2271960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2272bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
2273bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_is_base_class);
2274960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2275960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2276960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
2277960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2278960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2279960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2280960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2281960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2282960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2283960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2284960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2285960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2286960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
2287960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2288960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2289960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2290960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2291960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2292960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
22939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
22949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
22959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
22961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2305bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    char element_name[64];
2306bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_name.assign(element_name);
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(field_type_info.first % 8 == 0);
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_size = field_type_info.first / 8;
231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_offset = idx * child_byte_size;
231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return array->getElementType().getAsOpaquePtr();
231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetChildClangTypeAtIndex (ast_context,
232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
2334bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
2335bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_is_base_class);
233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
233824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
233924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2358f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::LValueReference:
2359f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::RValueReference:
2360f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            {
2361f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
2362f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                QualType pointee_type(reference_type->getPointeeType());
2363f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2364f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2365f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2366f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    return GetChildClangTypeAtIndex (ast_context,
2367f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     parent_name,
2368f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     pointee_clang_type,
2369f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     idx,
2370f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     transparent_pointers,
2371f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     omit_empty_base_classes,
2372f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_name,
2373f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_size,
2374f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_offset,
2375f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_size,
2376f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_offset,
2377f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_is_base_class);
2378f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2379f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                else
2380f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2381f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (parent_name)
2382f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2383f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name.assign(1, '&');
2384f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name += parent_name;
2385f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2386f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2387f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer to an simple type
2388f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (idx == 0)
2389f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2390f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
2391f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        assert(clang_type_info.first % 8 == 0);
2392f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_size = clang_type_info.first / 8;
2393f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_offset = 0;
2394f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        return pointee_type.getAsOpaquePtr();
2395f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2396f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2397f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            }
2398f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2399f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
24001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetChildClangTypeAtIndex (ast_context,
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
2411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_bitfield_bit_offset,
2412bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_is_base_class);
241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2419f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
2600462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
260903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
261003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
27009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
27019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
27029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
27039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
27049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
27059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2715823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
27239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
27249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
27269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
27279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
27289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
27299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
27319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
27329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
27339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
27349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
27359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
27369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (GetIndexOfChildMemberWithName (ast_context,
27389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
27399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
27409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
27419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
27429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
27439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
27449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
27459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
27469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
27479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
27499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
27509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
27519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
27529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
27539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
27549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
27559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
27599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
27609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildMemberWithName (ast_context,
27619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
27629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
27639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
27649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
27659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
27669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
27679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
27691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
28041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
28051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildMemberWithName (ast_context,
285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
2878462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
28869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
288703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
28889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
288903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
29349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
29359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
29369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
29379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
29389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
29399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
29409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
29419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
29429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
29439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
29459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
29469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
29479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
29489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
29509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
29519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
29529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
29549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
29559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
29569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
29579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
29589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
29609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
29619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
29629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
29649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
29659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
29669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
29679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
29689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
29699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
29709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
29719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
29729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
29749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
29759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildWithName (ast_context,
29769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
29779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
29789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
29799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
29809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
29819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
30171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
30181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildWithName (ast_context,
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3082462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
30871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = tag_qual_type.getTypePtr();
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(clang_type);
309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
3109462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
311503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
311603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
31209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
31219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
31229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
31239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
31249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
31259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
31269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
31279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
31289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
31299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
31309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
31319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
31329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
31339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
31349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
31359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
31369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
31379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
31389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
31409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
31419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
31429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
31439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
3170462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (&ast_context->Idents.get(name)),
318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3205462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3206462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context,
3207462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
3208462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
32092ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
32102ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
32112ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
322053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
32222ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                        is_variadic,
32232ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                        type_quals,
322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasExceptionSpec
322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasAnyExceptionSpec,
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // NumExs
322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // const QualType *ExArray
322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        FunctionType::ExtInfo ()).getAsOpaquePtr();    // NoReturn);
322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3232462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ParmVarDecl::Create(*ast_context,
323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                ast_context->getTranslationUnitDecl(),
323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                name && name[0] ? &ast_context->Idents.get(name) : NULL,
32402ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3257462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3258462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3277462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
32821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *t = qual_type.getTypePtr();
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3301462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
330655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
330755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
330855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
330955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
331155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
331255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
331355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
331455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
331555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
331604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
331704325065a00f646527db85e9bc751da29ac53b23Sean Callanan
331804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        if (objc_class_type)
331904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
332004325065a00f646527db85e9bc751da29ac53b23Sean Callanan            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
332104325065a00f646527db85e9bc751da29ac53b23Sean Callanan
332204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            class_interface_decl->setForwardDecl(false);
332304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
332404325065a00f646527db85e9bc751da29ac53b23Sean Callanan
332555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
332655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
332755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
332855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
332955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
333055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
333155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
333355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
333455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
333555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
333655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
333755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
333848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                ASTContext *ast_context = getASTContext();
333948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
334048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                QualType promotion_qual_type;
334148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // If the enum integer type is less than an integer in bit width,
334248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // then we must promote it to an integer size.
334348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                if (ast_context->getTypeSize(enum_decl->getIntegerType()) < ast_context->getTypeSize(ast_context->IntTy))
334448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                {
334548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
334648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                        promotion_qual_type = ast_context->IntTy;
334748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    else
334848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                        promotion_qual_type = ast_context->UnsignedIntTy;
334948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                }
335048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                else
335148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
335248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
335348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
335455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3364462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3365462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name, clang_type_t integer_qual_type)
336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
337148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
337248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    // TODO: ask about these...
337348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsScoped = false;
337448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsFixed = false;
337548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
337648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast_context,
337748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            ast_context->getTranslationUnitDecl(),
337848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
337948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            name && name[0] ? &ast_context->Idents.get(name) : NULL,
338048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
33818950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                            NULL, false, false); //IsScoped, IsFixed);
338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3383e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3384e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3385e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
3387e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3391462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3392462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3393462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3394462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3395462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3396462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang::Type *clang_type = enum_qual_type.getTypePtr();
3397462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3398462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3399462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3400462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3401462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3402462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3403462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3404462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3405462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3406462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3407462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3408462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3412462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3413462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = enum_qual_type.getTypePtr();
343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EnumConstantDecl::Create(*ast_context,
344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_type->getDecl(),
344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             SourceLocation(),
344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             name ? &identifier_table->get(name) : NULL,    // Identifier
344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             QualType::getFromOpaquePtr(enumerator_clang_type),
344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             NULL,
344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_llvm_apsint);
344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3462462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3463462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
34667b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
34677b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
34687b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
346903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
347003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
34717b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
34727b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
34737b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
34747b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton            return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
34757b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
34767b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
34777b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton            return getASTContext()->getPointerType(qual_type).getAsOpaquePtr();
34787b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
34797b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3483462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3484462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateLValueReferenceType (clang_type_t clang_type)
348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3491462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3492462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateRValueReferenceType (clang_type_t clang_type)
349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
349524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3499462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3500462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
3501fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
3502fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
3503fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
3504fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
3505fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
3506fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
3507fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
350924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTypeSize(ast_context->VoidPtrTy);
351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3516462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
352203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
352303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
352504325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
352604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
352704325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
352804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        default:
352904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            break;
353004325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
353104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
353204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return true;
353304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
353404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return false;
35351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
35591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3568462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3588462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
359303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
359403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
359604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::Type::Builtin:
359704325065a00f646527db85e9bc751da29ac53b23Sean Callanan            switch (cast<clang::BuiltinType>(qual_type)->getKind())
359804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            {
359904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            default:
360004325065a00f646527db85e9bc751da29ac53b23Sean Callanan                break;
360104325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCId:
360204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCClass:
360304325065a00f646527db85e9bc751da29ac53b23Sean Callanan                return true;
360404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            }
360504325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return false;
36061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
36101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
36141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
36181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
36221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type);
362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3632462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3670bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
3671bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool
3672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
3673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
3674bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type)
3675bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
3676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3677bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
3678bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (cxx_record_decl)
3680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
3681bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
3682bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return true;
3683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
3684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
3685bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    class_name.clear();
3686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return false;
3687bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
3688bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
3689bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
36901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
3691462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
36921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
36931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
36941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
36951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
36961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
36971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
36981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
36991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
37001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
37011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
37021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
3703462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
37041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
37051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
37061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
37071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
37081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
37091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
37101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
37111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
37121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
37131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
37141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
3715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool
3716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type)
3717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
3718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
3719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return QualType::getFromOpaquePtr(clang_type)->isCharType();
3720f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return false;
3721f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3724462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3726f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t pointee_or_element_clang_type = NULL;
3727f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
3728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
3729f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type == NULL)
3730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return false;
3731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
3732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
3735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
3736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3738f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3739f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (type_flags.Test (eTypeIsArray))
374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We know the size of the array and it could be a C string
3742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // since it is an array of characters
3743f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
3744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
3746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = 0;
3749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
375024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
375124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
375224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
375324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
375624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
375724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3758462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
375903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
376003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
376103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
376203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
376303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
376403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
376503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
376603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
376703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
376803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
376903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
377003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
377103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
377203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
377303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
377403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
377503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
377603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
377703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
377803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
377903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
378003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
378103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
378203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
378303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
378403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
378503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
3786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t
3787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type)
3788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
3789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
3790f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
3791f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
3792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (array)
3793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return array->getSize().getLimitedValue();
3794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
3795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return 0;
3796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
379703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
379803e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
3799462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
380703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
38151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
38211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
38261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
382724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
383024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
383524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
383724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
383824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3839462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3840462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
384224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TypedefDecl *decl = TypedefDecl::Create(*ast_context,
385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
385424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name ? &identifier_table->get(name) : NULL, // Identifier
385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                ast_context->CreateTypeSourceInfo(qual_type));
385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
385824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypedefType (decl).getAsOpaquePtr();
385924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
386024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
386124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
386224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
386424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
3865462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3869462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type));
387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3871462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3874462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const TypedefDecl *typedef_decl = typedef_type->getDecl();
387524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
387624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
387924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
388124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
388624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
388724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
389024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
3892462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
389324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
389424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
389524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
389624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
389724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
389824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
389924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
390324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
391724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
391824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
391924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
392024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
392124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
392224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
392324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
392424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
392624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
3927462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
392824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
392924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
393024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
393124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
393224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
393324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
393424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
393524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
393624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
393724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
393824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
394224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
394324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t bit_size = ast_context->getTypeSize (qual_type);
394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
394724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
394924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
395024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
395124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
395224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
396124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
396324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3964a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
3965a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
3966462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
3967a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
3968a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
3969a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
3970a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3971a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
3972a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
3973a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
3974