ClangASTContext.cpp revision e52f37baba95cc60d2fc78d9f8726dff5c3f3720
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));
315887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
316887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_ast_context_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_ast_context_ap.get();
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
343e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
344e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3578a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
3588a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
3598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
3608a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
36122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    {
36222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        clang::FileSystemOptions file_system_options;
36322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
36422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    }
3658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
3668a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
3678a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
3681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
37222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager()));
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic *
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic()
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_diagnostic_ap.get() == NULL)
380eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    {
381eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
382eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        m_diagnostic_ap.reset(new Diagnostic(diag_id_sp));
383eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    }
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_diagnostic_ap.get();
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
387887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient
388887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
389887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic:
390887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    NullDiagnosticClient ()
391887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
392887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
393887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
394887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
395887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info)
396887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
397887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        if (m_log)
398887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        {
399887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            llvm::SmallVectorImpl<char> diag_str(10);
400887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            info.FormatDiagnostic(diag_str);
401887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            diag_str.push_back('\0');
402887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
403887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        }
404887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
405887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate:
406887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    LogSP m_log;
407887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan};
408887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
409887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient *
410887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient()
411887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
412887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    if (m_diagnostic_client_ap.get() == NULL)
413887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_diagnostic_client_ap.reset(new NullDiagnosticClient);
414887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
415887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    return m_diagnostic_client_ap.get();
416887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}
417887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_options_ap.reset (new TargetOptions());
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_target_options_ap.get())
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_target_options_ap->Triple = m_target_triple;
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_options_ap.get();
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // target_triple should be something like "x86_64-apple-darwin10"
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
451462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
452585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
461462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
462462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size)
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!ast_context)
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
469585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->VoidPtrTy.getAsOpaquePtr();
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
474585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedCharTy.getAsOpaquePtr();
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedShortTy.getAsOpaquePtr();
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedIntTy.getAsOpaquePtr();
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongTy.getAsOpaquePtr();
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
489585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->CharTy.getAsOpaquePtr();
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->ShortTy.getAsOpaquePtr();
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->IntTy.getAsOpaquePtr();
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongTy.getAsOpaquePtr();
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongLongTy.getAsOpaquePtr();
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->Int128Ty.getAsOpaquePtr();
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
504585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->FloatTy.getAsOpaquePtr();
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->DoubleTy.getAsOpaquePtr();
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ast_context->LongDoubleTy.getAsOpaquePtr();
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
513585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
521462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    #define streq(a,b) strcmp(a,b) == 0
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context)
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_address:
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->VoidPtrTy.getAsOpaquePtr();
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_boolean:
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->BoolTy.getAsOpaquePtr();
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
551e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton        case DW_ATE_lo_user:
552e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            // This has been seen to mean DW_AT_complex_integer
553e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            if (strcmp(type_name, "complex") == 0)
554e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
555e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
556e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                return ast_context->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
557e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
558e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            break;
559e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_complex_float:
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatComplexTy.getAsOpaquePtr();
563e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleComplexTy.getAsOpaquePtr();
565e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
567e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            else
568e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            {
569e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
570e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton                return ast_context->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
571e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton            }
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_float:
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->FloatTy.getAsOpaquePtr();
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->DoubleTy.getAsOpaquePtr();
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongDoubleTy.getAsOpaquePtr();
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed:
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
5868ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
5888ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
5898ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->LongLongTy.getAsOpaquePtr();
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
5918ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->LongTy.getAsOpaquePtr();
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
5968ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->ShortTy.getAsOpaquePtr();
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6018ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->CharTy.getAsOpaquePtr();
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6088ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
6098ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
6108ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
6118ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->IntTy.getAsOpaquePtr();
6128ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
6138ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->Int128Ty.getAsOpaquePtr();
6148ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
6158ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (streq(type_name, "wchar_t"))
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->WCharTy.getAsOpaquePtr();
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->ShortTy.getAsOpaquePtr();
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->IntTy.getAsOpaquePtr();
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongTy.getAsOpaquePtr();
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->LongLongTy.getAsOpaquePtr();
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->Int128Ty.getAsOpaquePtr();
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_signed_char:
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (streq(type_name, "signed char"))
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->SignedCharTy.getAsOpaquePtr();
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->CharTy.getAsOpaquePtr();
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->SignedCharTy.getAsOpaquePtr();
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned:
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (type_name)
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
6548ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                if (strstr(type_name, "long long"))
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
6568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
6578ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6598ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "long"))
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedLongTy.getAsOpaquePtr();
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6648ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "short"))
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedShortTy.getAsOpaquePtr();
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6698ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "char"))
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return ast_context->UnsignedCharTy.getAsOpaquePtr();
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
6748ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                else if (strstr(type_name, "int"))
6758ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
6768ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
6778ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->UnsignedIntTy.getAsOpaquePtr();
6788ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                    if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
6798ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                        return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
6808ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We weren't able to match up a type name, just search by size
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedShortTy.getAsOpaquePtr();
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedIntTy.getAsOpaquePtr();
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongTy.getAsOpaquePtr();
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_unsigned_char:
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ast_context->UnsignedCharTy.getAsOpaquePtr();
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case DW_ATE_imaginary_float:
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
712462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
713462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context)
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
715a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return ast_context->VoidTy.getAsOpaquePtr();
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
718462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
719a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool()
720a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{
721a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan    return getASTContext()->BoolTy.getAsOpaquePtr();
722a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan}
723a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan
724a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t
725960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id()
726960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
727c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr();
728960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
729960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
730462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
731960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class()
732960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
73304325065a00f646527db85e9bc751da29ac53b23Sean Callanan    return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr();
734960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
735960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
736462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
737960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector()
738960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{
739c4217a663232c014ee054f55bd90ece79803c963Sean Callanan    return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr();
740960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
741960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
742462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType char_type(getASTContext()->CharTy);
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
753462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const)
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetVoidPtrType(getASTContext(), is_const);
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
759462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
760462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const)
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType void_ptr_type(ast_context->VoidPtrTy);
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void_ptr_type.addConst();
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return void_ptr_type.getAsOpaquePtr();
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
770462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
77122defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast,
77222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
773462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                           clang_type_t clang_type)
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7758a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
77622defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
77722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
77822defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                         *src_ast, file_manager);
779cf18faaf72090a68480145ca206955d792633559Sean Callanan
78022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType src (QualType::getFromOpaquePtr(clang_type));
78122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    QualType dst (importer.Import(src));
782cf18faaf72090a68480145ca206955d792633559Sean Callanan
783cf18faaf72090a68480145ca206955d792633559Sean Callanan    return dst.getAsOpaquePtr();
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7866916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
7876916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
78822defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast,
78922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
7906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
791887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
7928a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
79322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
79422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
79522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                         *src_ast, file_manager);
7966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
7976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
7986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
7996916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
8008d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
801462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context,
802462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type1,
803462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton             clang_type_t type2)
8045510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
8055510dddc33260a991284ef81ca343594f23262e8Sean Callanan    return ast_context->hasSameType(QualType::getFromOpaquePtr(type1),
8065510dddc33260a991284ef81ca343594f23262e8Sean Callanan                                    QualType::getFromOpaquePtr(type2));
8075510dddc33260a991284ef81ca343594f23262e8Sean Callanan}
8085510dddc33260a991284ef81ca343594f23262e8Sean Callanan
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
811462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
812462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type)
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.addConst();
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
823462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
824462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type)
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setRestrict (true);
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
835462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
836462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type)
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType result(QualType::getFromOpaquePtr(clang_type));
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.getQualifiers().setVolatile (true);
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return result.getAsOpaquePtr();
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
849462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
850585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
85404325065a00f646527db85e9bc751da29ac53b23Sean Callanan
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        decl_ctx = ast_context->getTranslationUnitDecl();
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
859585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    if (language == eLanguageTypeObjC)
8609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
861306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
8629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
8639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal);
8649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
8659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                (TagDecl::TagKind)kind,
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name && name[0] ? &ast_context->Idents.get(name) : NULL);
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTagDeclType(decl).getAsOpaquePtr();
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
886494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator"
887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
888c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
889c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    const char *post_op_name = NULL;
890c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
891494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    bool no_space = true;
892c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
894494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        return false;
895494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan
896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
898494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    if (post_op_name[0] == ' ')
899c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    {
900494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        post_op_name++;
901494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        no_space = false;
902c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    }
903c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
904494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX
905427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH
906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
913c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    default:
914c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
915c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
916c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        break;
917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
918c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
919c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
927c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
928c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
997dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
998dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
999dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1000dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1001dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1002dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
1003dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
1004dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1005dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1006dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1007dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1008dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
1009dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1010dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
1011dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1012dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1013dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1014dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1015dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
1016dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
1017dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1018dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1019dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1020dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1021dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
1022dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1023dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
1024dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1025dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1026dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
1027dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1028dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
1029dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1030dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
1031dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1032dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1033dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
1034dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1035dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
1036dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1037dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
1038dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1039dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1040dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1041dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1042dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1043dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1044dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1045dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1046dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1047dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1048dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1049dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1050dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1051dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1052dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1053dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1054dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1055dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1056dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1057dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1058dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1059dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1060dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1061dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1062dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1063dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1064dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1065dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1066dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1067dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1068dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1069dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1070dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1071dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1072dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1073dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1074dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1075dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1076dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1077dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1078dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1079dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1080dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1081dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1082dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1083dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1084dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1085dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1086dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1087dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1088dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1089dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1090dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1091dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1092dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1093dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1094dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1095412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl *
1096795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType
1097795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan(
1098462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1099462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_opaque_type,
1100412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    const char *name,
1101462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
1102412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    lldb::AccessType access,
11031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_virtual,
11041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_static,
110530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_inline,
110630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    bool is_explicit
1107412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton)
1108795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
11093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!record_opaque_type || !method_opaque_type || !name)
1110974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        return NULL;
1111795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1112795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(ast_context);
1113795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1114795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
1115795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1116795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    assert(identifier_table);
1117795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
11191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
11201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *clang_type(record_qual_type.getTypePtr());
1121795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type == NULL)
1123412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1124795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    RecordType *record_clang_type(dyn_cast<RecordType>(clang_type));
1126795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (record_clang_type == NULL)
1128412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1129795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    RecordDecl *record_decl = record_clang_type->getDecl();
1131795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (record_decl == NULL)
1133412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1134795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1135795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan    CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1136795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (cxx_record_decl == NULL)
1138412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton        return NULL;
1139795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
11401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
11411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
114230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    CXXMethodDecl *cxx_method_decl = NULL;
11433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
114430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    DeclarationName decl_name (&identifier_table->get(name));
114590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
114690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    const bool is_implicitly_declared = false;
114790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
11485325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
114990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
11505325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    if (function_Type == NULL)
115190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
115290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
11535325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
115430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
115590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (!method_function_prototype)
115690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        return NULL;
115790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
115890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    unsigned int num_params = method_function_prototype->getNumArgs();
115990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
116090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    if (name[0] == '~')
116190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
116290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        cxx_method_decl = CXXDestructorDecl::Create (*ast_context,
116390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
11645325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                     DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
116590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
11668950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan                                                     NULL,
116790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline,
116890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_implicitly_declared);
116990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    }
117090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    else if (decl_name == record_decl->getDeclName())
117130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    {
117230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        cxx_method_decl = CXXConstructorDecl::Create (*ast_context,
117330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      cxx_record_decl,
11745325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                      DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
117530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      method_qual_type,
117630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      NULL, // TypeSourceInfo *
117730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_explicit,
117830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_inline,
117930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                      is_implicitly_declared);
118030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
118130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    else
118290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton    {
1183dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (IsOperator (name, op_kind))
118690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (op_kind != NUM_OVERLOADED_OPERATORS)
1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                cxx_method_decl = CXXMethodDecl::Create (*ast_context,
119090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         cxx_record_decl,
1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
119290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         method_qual_type,
119390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                         NULL, // TypeSourceInfo *
1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_static,
1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         SC_None,
1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                         is_inline);
1197dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (num_params == 0)
1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                // Conversion operators don't take params...
1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                cxx_method_decl = CXXConversionDecl::Create (*ast_context,
1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             cxx_record_decl,
12035325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton                                                             DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()),
1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             method_qual_type,
1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             NULL, // TypeSourceInfo *
1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_inline,
1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                             is_explicit);
1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
120990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (cxx_method_decl == NULL)
121290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        {
121390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton            cxx_method_decl = CXXMethodDecl::Create (*ast_context,
121490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     cxx_record_decl,
1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                                                     DeclarationNameInfo (decl_name, SourceLocation()),
121690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     method_qual_type,
121790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     NULL, // TypeSourceInfo *
121890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_static,
121990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     SC_None,
122090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton                                                     is_inline);
122190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton        }
122230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton    }
1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1224462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
122547a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
12261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setAccess (access_specifier);
12271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setVirtualAsWritten (is_virtual);
122847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan
12293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    // Populate the method decl with parameter decls
12303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ParmVarDecl *params[num_params];
12323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    for (int param_index = 0;
12343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         param_index < num_params;
12353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan         ++param_index)
12363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
12371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        params[param_index] = ParmVarDecl::Create (*ast_context,
12381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   cxx_method_decl,
12391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
12401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
12411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
12421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
12431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
12441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_None,
12451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL);
12463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_method_decl->setParams (params, num_params);
12493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    cxx_record_decl->addDecl (cxx_method_decl);
1251795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1252412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton    return cxx_method_decl;
1253795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan}
1254795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan
1255795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool
125684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType
125784f8075072eef306234f8109573067647735c111Greg Clayton(
1258462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1259462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t record_clang_type,
126084f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1261462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t field_type,
126284f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
126384f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size
126484f8075072eef306234f8109573067647735c111Greg Clayton)
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_clang_type == NULL || field_type == NULL)
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (identifier_table != NULL);
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    clang::Type *clang_type = record_qual_type.getTypePtr();
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (record_type)
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl *record_decl = record_type->getDecl();
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::Expr *bit_width = NULL;
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bitfield_bit_size != 0)
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
128947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
129184f8075072eef306234f8109573067647735c111Greg Clayton            FieldDecl *field = FieldDecl::Create (*ast_context,
129284f8075072eef306234f8109573067647735c111Greg Clayton                                                  record_decl,
129384f8075072eef306234f8109573067647735c111Greg Clayton                                                  SourceLocation(),
129484f8075072eef306234f8109573067647735c111Greg Clayton                                                  name ? &identifier_table->get(name) : NULL, // Identifier
129584f8075072eef306234f8109573067647735c111Greg Clayton                                                  QualType::getFromOpaquePtr(field_type), // Field type
129684f8075072eef306234f8109573067647735c111Greg Clayton                                                  NULL,       // DeclaratorInfo *
129784f8075072eef306234f8109573067647735c111Greg Clayton                                                  bit_width,  // BitWidth
129884f8075072eef306234f8109573067647735c111Greg Clayton                                                  false);     // Mutable
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130084f8075072eef306234f8109573067647735c111Greg Clayton            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (field)
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                record_decl->addDecl(field);
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
13089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
13099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
13109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
13119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
13121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                bool is_synthesized = false;
131360a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                ClangASTContext::AddObjCClassIVar (ast_context,
131460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan                                                   record_clang_type,
13159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   name,
13169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   field_type,
13179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   access,
13189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                   bitfield_bit_size,
13191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_synthesized);
13209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
13219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ast_context == NULL || field == NULL)
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1386462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type)
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
13911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = qual_type.getTypePtr();
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl *record_decl = record_type->getDecl();
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (record_decl)
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t field_idx;
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RecordDecl::field_iterator field, field_end;
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         field != field_end;
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++field, ++field_idx)
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // If no accessibility was assigned, assign the correct one
140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            field->setAccess ((AccessSpecifier)default_accessibility);
140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier *
1419462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (base_class_type)
14226e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton        return new CXXBaseSpecifier (SourceRange(),
14236e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     is_virtual,
14246e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     base_of_class,
14256e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     ConvertAccessTypeToAccessSpecifier (access),
14266e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)));
142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1430e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid
1431e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
1432e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{
1433e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    for (unsigned i=0; i<num_base_classes; ++i)
1434e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    {
1435e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        delete base_classes[i];
1436e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton        base_classes[i] = NULL;
1437e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton    }
1438e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton}
1439e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1441462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (class_clang_type)
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordType *record_type = dyn_cast<RecordType>(clang_type);
144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (record_type)
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    cxx_record_decl->setBases(base_classes, num_base_classes);
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
146284f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
146384f8075072eef306234f8109573067647735c111Greg Clayton
1464462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
146584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass
146684f8075072eef306234f8109573067647735c111Greg Clayton(
146784f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
146884f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
146984f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
147084f8075072eef306234f8109573067647735c111Greg Clayton    bool isInternal
147184f8075072eef306234f8109573067647735c111Greg Clayton)
147284f8075072eef306234f8109573067647735c111Greg Clayton{
147384f8075072eef306234f8109573067647735c111Greg Clayton    ASTContext *ast_context = getASTContext();
147484f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
147584f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
147684f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
147784f8075072eef306234f8109573067647735c111Greg Clayton        decl_ctx = ast_context->getTranslationUnitDecl();
147884f8075072eef306234f8109573067647735c111Greg Clayton
147984f8075072eef306234f8109573067647735c111Greg Clayton    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
148084f8075072eef306234f8109573067647735c111Greg Clayton    // we will need to update this code. I was told to currently always use
148184f8075072eef306234f8109573067647735c111Greg Clayton    // the CXXRecordDecl class since we often don't know from debug information
148284f8075072eef306234f8109573067647735c111Greg Clayton    // if something is struct or a class, so we default to always use the more
148384f8075072eef306234f8109573067647735c111Greg Clayton    // complete definition just in case.
148484f8075072eef306234f8109573067647735c111Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context,
148584f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
148684f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
148784f8075072eef306234f8109573067647735c111Greg Clayton                                                         &ast_context->Idents.get(name),
148884f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
148984f8075072eef306234f8109573067647735c111Greg Clayton                                                         isForwardDecl,
149084f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr();
149384f8075072eef306234f8109573067647735c111Greg Clayton}
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149584f8075072eef306234f8109573067647735c111Greg Claytonbool
1496462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
149784f8075072eef306234f8109573067647735c111Greg Clayton{
149884f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type && super_opaque_type)
149984f8075072eef306234f8109573067647735c111Greg Clayton    {
150084f8075072eef306234f8109573067647735c111Greg Clayton        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
150184f8075072eef306234f8109573067647735c111Greg Clayton        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
150284f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *class_type = class_qual_type.getTypePtr();
150384f8075072eef306234f8109573067647735c111Greg Clayton        clang::Type *super_type = super_qual_type.getTypePtr();
150484f8075072eef306234f8109573067647735c111Greg Clayton        if (class_type && super_type)
150584f8075072eef306234f8109573067647735c111Greg Clayton        {
150684f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
150784f8075072eef306234f8109573067647735c111Greg Clayton            ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
150884f8075072eef306234f8109573067647735c111Greg Clayton            if (objc_class_type && objc_super_type)
150984f8075072eef306234f8109573067647735c111Greg Clayton            {
151084f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
151184f8075072eef306234f8109573067647735c111Greg Clayton                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
151284f8075072eef306234f8109573067647735c111Greg Clayton                if (class_interface_decl && super_interface_decl)
151384f8075072eef306234f8109573067647735c111Greg Clayton                {
151484f8075072eef306234f8109573067647735c111Greg Clayton                    class_interface_decl->setSuperClass(super_interface_decl);
151584f8075072eef306234f8109573067647735c111Greg Clayton                    return true;
151684f8075072eef306234f8109573067647735c111Greg Clayton                }
151784f8075072eef306234f8109573067647735c111Greg Clayton            }
151884f8075072eef306234f8109573067647735c111Greg Clayton        }
151984f8075072eef306234f8109573067647735c111Greg Clayton    }
152084f8075072eef306234f8109573067647735c111Greg Clayton    return false;
152184f8075072eef306234f8109573067647735c111Greg Clayton}
152284f8075072eef306234f8109573067647735c111Greg Clayton
152384f8075072eef306234f8109573067647735c111Greg Clayton
152484f8075072eef306234f8109573067647735c111Greg Claytonbool
152584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar
152684f8075072eef306234f8109573067647735c111Greg Clayton(
1527462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1528462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
152984f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
1530462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t ivar_opaque_type,
153184f8075072eef306234f8109573067647735c111Greg Clayton    AccessType access,
153284f8075072eef306234f8109573067647735c111Greg Clayton    uint32_t bitfield_bit_size,
15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized
153484f8075072eef306234f8109573067647735c111Greg Clayton)
153584f8075072eef306234f8109573067647735c111Greg Clayton{
153684f8075072eef306234f8109573067647735c111Greg Clayton    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
153784f8075072eef306234f8109573067647735c111Greg Clayton        return false;
153884f8075072eef306234f8109573067647735c111Greg Clayton
153960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan    IdentifierTable *identifier_table = &ast_context->Idents;
154084f8075072eef306234f8109573067647735c111Greg Clayton
154184f8075072eef306234f8109573067647735c111Greg Clayton    assert (ast_context != NULL);
154284f8075072eef306234f8109573067647735c111Greg Clayton    assert (identifier_table != NULL);
154384f8075072eef306234f8109573067647735c111Greg Clayton
154484f8075072eef306234f8109573067647735c111Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
154584f8075072eef306234f8109573067647735c111Greg Clayton
154684f8075072eef306234f8109573067647735c111Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
154784f8075072eef306234f8109573067647735c111Greg Clayton    if (class_type)
154884f8075072eef306234f8109573067647735c111Greg Clayton    {
154984f8075072eef306234f8109573067647735c111Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
155084f8075072eef306234f8109573067647735c111Greg Clayton
155184f8075072eef306234f8109573067647735c111Greg Clayton        if (objc_class_type)
155284f8075072eef306234f8109573067647735c111Greg Clayton        {
155384f8075072eef306234f8109573067647735c111Greg Clayton            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
155484f8075072eef306234f8109573067647735c111Greg Clayton
155584f8075072eef306234f8109573067647735c111Greg Clayton            if (class_interface_decl)
155684f8075072eef306234f8109573067647735c111Greg Clayton            {
155784f8075072eef306234f8109573067647735c111Greg Clayton                clang::Expr *bit_width = NULL;
155884f8075072eef306234f8109573067647735c111Greg Clayton                if (bitfield_bit_size != 0)
155984f8075072eef306234f8109573067647735c111Greg Clayton                {
156084f8075072eef306234f8109573067647735c111Greg Clayton                    APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
156147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan                    bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
156284f8075072eef306234f8109573067647735c111Greg Clayton                }
156384f8075072eef306234f8109573067647735c111Greg Clayton
15649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context,
15659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            class_interface_decl,
15669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            SourceLocation(),
15679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            &identifier_table->get(name), // Identifier
15689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
15699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            NULL, // TypeSourceInfo *
15709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            ConvertAccessTypeToObjCIvarAccessControl (access),
15719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                            bit_width,
15721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                            is_synthesized);
15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (field)
15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
15769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    class_interface_decl->addDecl(field);
15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    return true;
15789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
157984f8075072eef306234f8109573067647735c111Greg Clayton            }
158084f8075072eef306234f8109573067647735c111Greg Clayton        }
158184f8075072eef306234f8109573067647735c111Greg Clayton    }
158284f8075072eef306234f8109573067647735c111Greg Clayton    return false;
158384f8075072eef306234f8109573067647735c111Greg Clayton}
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15869488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
1587462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
15889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
15899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
15909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
15929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    if (class_type)
15939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
15949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
15959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
15969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (objc_class_type)
15979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
15989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
15999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
16009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
16019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
16029488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool
16039488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
16049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{
16059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    while (class_interface_decl)
16069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
16079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (class_interface_decl->ivar_size() > 0)
16089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            return true;
16099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
16109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        if (check_superclass)
16119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            class_interface_decl = class_interface_decl->getSuperClass();
16129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        else
16139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
16149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
16159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    return false;
16169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton}
16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1618462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl *
16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType
16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton(
1621462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    ASTContext *ast_context,
1622462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t class_opaque_type,
16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
1624462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t method_opaque_type,
16251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    lldb::AccessType access
16261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton)
16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_opaque_type == NULL || method_opaque_type == NULL)
16291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    IdentifierTable *identifier_table = &ast_context->Idents;
16321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (ast_context != NULL);
16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    assert (identifier_table != NULL);
16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
16371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *class_type = class_qual_type.getTypePtr();
16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_type == NULL)
16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_class_type == NULL)
16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (class_interface_decl == NULL)
16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *selector_start = ::strchr (name, ' ');
16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_start == NULL)
16541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    selector_start++;
16571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
16581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
16601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1661ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    size_t len = 0;
16621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const char *start;
1663ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    //printf ("name = '%s'\n", name);
1664ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton
1665ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    unsigned num_selectors_with_args = 0;
1666ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    for (start = selector_start;
16671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton         start && *start != '\0' && *start != ']';
1668ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton         start += len)
16691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
1670ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton        len = ::strcspn(start, ":]");
16716bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        bool has_arg = (start[len] == ':');
16726bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
1673ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton            ++num_selectors_with_args;
16741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
16756bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton        if (has_arg)
16766bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton            len += 1;
16771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
16781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (selector_idents.size() == 0)
16811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return 0;
16821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1683ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton    clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
16841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                                          selector_idents.data());
16851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
16871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    // Populate the method decl with parameter decls
16891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    clang::Type *method_type(method_qual_type.getTypePtr());
16901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (method_type == NULL)
16921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
16951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (!method_function_prototype)
16971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
16981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
16991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_variadic = false;
17011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_synthesized = false;
17021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    bool is_defined = false;
17031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
17041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    const unsigned num_args = method_function_prototype->getNumArgs();
17061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context,
17081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // beginLoc,
17091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               SourceLocation(), // endLoc,
17101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_selector,
17111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               method_function_prototype->getResultType(),
17121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               NULL, // TypeSourceInfo *ResultTInfo,
17131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               GetDeclContextForType (class_opaque_type),
17141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               name[0] == '-',
17151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_variadic,
17161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_synthesized,
17171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               is_defined,
17181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               imp_control,
17191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                               num_args);
17201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (objc_method_decl == NULL)
17231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        return NULL;
17241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (num_args > 0)
17261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
17271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        llvm::SmallVector<ParmVarDecl *, 12> params;
17281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        for (int param_index = 0; param_index < num_args; ++param_index)
17301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
17311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            params.push_back (ParmVarDecl::Create (*ast_context,
17321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   objc_method_decl,
17331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
17341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL, // anonymous
17351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_function_prototype->getArgType(param_index),
17361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
17371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
17381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SC_Auto,
17391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL));
17401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        }
17411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args);
17431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
17449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
17451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    class_interface_decl->addDecl (objc_method_decl);
17461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return objc_method_decl;
17491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
17501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
17511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
1752bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t
1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo
1754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton(
1755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type,
1756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang::ASTContext *ast_context,
1757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t *pointee_or_element_clang_type
1758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton)
1759bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
1760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type == NULL)
1761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return 0;
1762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type)
1764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        *pointee_or_element_clang_type = NULL;
1765bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1766bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
1767bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1769bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    switch (type_class)
1770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
177104325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
177204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
177304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
177404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
177504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
1776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (ast_context && pointee_or_element_clang_type)
1777f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                *pointee_or_element_clang_type = ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
177804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
1779f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1780f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        default:
1781f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
178204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
178304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return eTypeIsBuiltIn | eTypeHasValue;
1784f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1785f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::BlockPointer:
1786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
1789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1790e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                          return eTypeIsBuiltIn | eTypeHasValue;
1791f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ConstantArray:
1793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::DependentSizedArray:
1794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::IncompleteArray:
1795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::VariableArray:
1796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
1798f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsArray;
1799f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentName:                    return 0;
1801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
1802bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
1803bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Decltype:                         return 0;
1804f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1805f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Enum:
1806f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
1808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeIsEnumeration | eTypeHasValue;
1809f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1810bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Elaborated:                       return 0;
1811bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
1812bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
1813bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
1814bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::InjectedClassName:                return 0;
1815f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1816f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
1817f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
1818f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1819f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
1820f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
1821f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1822bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
1823f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1824f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::ObjCObjectPointer:
1825f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1826f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1827f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
1828f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1829bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
1830bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
1831f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1832f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Pointer:
1833f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_clang_type)
1834f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
1835f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
1836f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1837bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Record:
1838bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (qual_type->getAsCXXRecordDecl())
1839bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
1840bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        else
1841bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return eTypeHasChildren | eTypeIsStructUnion;
1842bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        break;
1843bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
1844bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
1845bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
1846f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1847f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::Typedef:
18489e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
1849f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  ast_context,
1850f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                  pointee_or_element_clang_type);
1851f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1852bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOfExpr:                       return 0;
1853bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::TypeOf:                           return 0;
1854bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::UnresolvedUsing:                  return 0;
1855bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
1856bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    default:                                            return 0;
1857bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1858bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return 0;
1859bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1860bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
18619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types
186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1865462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type)
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
187303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
18761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
18771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
18781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ExtVector:
18791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Vector:
18801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
18829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
18869e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The clang type does have a value
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
1896462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes)
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_qual_type == NULL)
189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_children = 0;
190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    switch (type_class)
190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton    case clang::Type::Builtin:
1907960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
1908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
1909f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::BuiltinType::ObjCId:    // child is Class
1910960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::BuiltinType::ObjCClass: // child is Class
1911960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            num_children = 1;
1912f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
1913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
1914960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        default:
1915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
1916960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
1917960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
1918c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1919e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex: return 0;
1920c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
19211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Record:
192253d287bda5182511685a1dc7961a54b30bf3eedcGreg Clayton        if (ClangASTType::IsDefined (clang_qual_type))
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const RecordDecl *record_decl = record_type->getDecl();
192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert(record_decl);
192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cxx_record_decl)
192924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Check each base classes to see if it or any of its
193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // base classes contain any fields. This can help
193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // limit the noise in variable views by not having to
193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // show base classes that contain no members.
193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (RecordHasFields(base_class_decl) == false)
194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        num_children++;
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Include all base classes
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    num_children += cxx_record_decl->getNumBases();
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            RecordDecl::field_iterator field, field_end;
195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_children;
196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:
19649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:
19659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        {
19669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
19679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            assert (objc_class_type);
19689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            if (objc_class_type)
19699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
19709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
19719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (class_interface_decl)
19739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
19749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
19769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (superclass_interface_decl)
19779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
19789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (omit_empty_base_classes)
19799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
19809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
19819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++num_children;
19829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
19839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        else
19849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ++num_children;
19859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
19869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    num_children += class_interface_decl->ivar_size();
19889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
19899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
19909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        }
19919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        break;
19929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
19939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:
1994960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        {
1995960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
1996960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            QualType pointee_type = pointer_type->getPointeeType();
1997960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
1998960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                                             omit_empty_base_classes);
1999960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            // If this type points to a simple type, then it has 1 child
2000960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            if (num_pointee_children == 0)
2001960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = 1;
2002960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            else
2003960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                num_children = num_pointee_children;
2004960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        }
2005960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        break;
20069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
20071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2014c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            QualType pointee_type (pointer_type->getPointeeType());
20159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
20169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                                             omit_empty_base_classes);
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (num_pointee_children == 0)
2018c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2019c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We have a pointer to a pointee type that claims it has no children.
2020c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                // We will want to look at
2021c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
2022c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                num_children = num_pointee_children;
202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2028f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::LValueReference:
2029f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case clang::Type::RValueReference:
2030f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
2031f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2032f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType pointee_type = reference_type->getPointeeType();
2033f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
2034f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                                             omit_empty_base_classes);
2035f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            // If this type points to a simple type, then it has 1 child
2036f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (num_pointee_children == 0)
2037f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = 1;
2038f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
2039f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                num_children = num_pointee_children;
2040f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
2041f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
2042f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2043f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
20441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
20459e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), omit_empty_base_classes);
204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_children;
205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2054c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no
2055c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a
2056c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer,
2057c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type
2058c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show.
2059c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t
2060c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
2061c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{
2062c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (clang_type == NULL)
2063c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        return 0;
2064c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2065c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
2066c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2067c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    switch (type_class)
2068c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
20699db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    case clang::Type::Builtin:
20709db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        switch (cast<clang::BuiltinType>(qual_type)->getKind())
20719db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        {
20729db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Void:
20739db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::NullPtr:
20749db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 0;
20759db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Bool:
20769db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_U:
20779db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UChar:
20789db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char16:
20799db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char32:
20809db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UShort:
20819db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt:
20829db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULong:
20839db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ULongLong:
20849db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UInt128:
20859db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Char_S:
20869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::SChar:
20879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::WChar:
20889db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Short:
20899db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int:
20909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Long:
20919db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongLong:
20929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Int128:
20939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Float:
20949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Double:
20959db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::LongDouble:
20969db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Dependent:
20979db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::Overload:
20989db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::UndeducedAuto:
20999db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCId:
21009db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCClass:
21019db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        case clang::BuiltinType::ObjCSel:
21029db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton            return 1;
21039db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        }
21049db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        break;
21059db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
2106e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton    case clang::Type::Complex:                  return 1;
2107c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Pointer:                  return 1;
2108c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
2109c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::LValueReference:          return 1;
2110c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::RValueReference:          return 1;
2111c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::MemberPointer:            return 0;
2112c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ConstantArray:            return 0;
2113c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::IncompleteArray:          return 0;
2114c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::VariableArray:            return 0;
2115c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedArray:      return 0;
2116c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentSizedExtVector:  return 0;
2117c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Vector:                   return 0;
2118c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ExtVector:                return 0;
2119c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
2120c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
2121c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::UnresolvedUsing:          return 0;
2122c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Paren:                    return 0;
2123c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Typedef:                  return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
2124c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOfExpr:               return 0;
2125c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TypeOf:                   return 0;
2126c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Decltype:                 return 0;
2127c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Record:                   return 0;
2128c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Enum:                     return 1;
2129c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::Elaborated:               return 1;
2130c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateTypeParm:         return 1;
2131c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::SubstTemplateTypeParm:    return 1;
2132c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::TemplateSpecialization:   return 1;
2133c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::InjectedClassName:        return 0;
2134c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentName:            return 1;
2135c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::DependentTemplateSpecialization:  return 1;
2136c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObject:               return 0;
2137c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCInterface:            return 0;
2138c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    case clang::Type::ObjCObjectPointer:        return 1;
2139c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    default:
2140c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        break;
2141c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2142c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    return 0;
2143c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton}
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2145462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2149462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2157bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
2158bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool &child_is_base_class
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type)
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return GetChildClangTypeAtIndex (getASTContext(),
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_name,
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         parent_clang_type,
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         idx,
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         transparent_pointers,
216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         omit_empty_base_classes,
216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_name,
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_size,
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_byte_offset,
217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         child_bitfield_bit_size,
2173bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_bitfield_bit_offset,
2174bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                         child_is_base_class);
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2178462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex
218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *parent_name,
2183462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t parent_clang_type,
218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t idx,
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool transparent_pointers,
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string& child_name,
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_byte_size,
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t &child_byte_offset,
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t &child_bitfield_bit_size,
2191bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    uint32_t &child_bitfield_bit_offset,
2192bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool &child_is_base_class
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (parent_clang_type == NULL)
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t bit_offset;
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_size = 0;
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_bitfield_bit_offset = 0;
2203bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        child_is_base_class = false;
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
220503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
220603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (parent_type_class)
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2208960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        case clang::Type::Builtin:
2209960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2210960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            {
2211960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCId:
2212960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            case clang::BuiltinType::ObjCClass:
221304325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_name = "isa";
221404325065a00f646527db85e9bc751da29ac53b23Sean Callanan                child_byte_size = ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / CHAR_BIT;
2215960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
2216960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2217960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            default:
2218960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                break;
2219960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            }
2220960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton            break;
2221960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2222960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
22231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We might have base classes to print out first
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const CXXRecordDecl *base_class_decl = NULL;
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes)
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (RecordHasFields(base_class_decl) == false)
224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                continue;
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (idx == child_idx)
225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class_decl == NULL)
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            if (base_class->isVirtual())
22578a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity();
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
22598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity();
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes should be a multiple of 8 bits in size
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (bit_offset % 8 == 0);
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_offset = bit_offset/8;
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            std::string base_class_type_name(base_class->getType().getAsString());
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_name.assign(base_class_type_name.c_str());
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            // Base classes biut sizes should be a multiple of 8 bits in size
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            assert (clang_type_info_bit_size % 8 == 0);
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_byte_size = clang_type_info_bit_size / 8;
2273bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            child_is_base_class = true;
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return base_class->getType().getAsOpaquePtr();
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We don't increment the child index in the for loop since we might
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // be skipping empty base classes
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Make sure index is in range...
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t field_idx = 0;
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == child_idx)
228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member type if requested
228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Print the member name and equal sign
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(field->getNameAsString().c_str());
229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the type byte size (field_type_info.first) and
229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // alignment (field_type_info.second) from the AST context.
229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
229554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                        assert(field_idx < record_layout.getFieldCount());
229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = field_type_info.first / 8;
229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Figure out the field offset within the current struct/union/class type
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        bit_offset = record_layout.getFieldOffset (field_idx);
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = bit_offset / 8;
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            child_bitfield_bit_offset = bit_offset % 8;
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return field->getType().getAsOpaquePtr();
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
23129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
23139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
23149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
23169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl);
23259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
23269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
23279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
23289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (omit_empty_base_classes)
23299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
2330960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
23319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
23329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    if (idx == 0)
23339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    {
23349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl));
23359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_name.assign(superclass_interface_decl->getNameAsString().c_str());
23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
23409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        child_byte_size = ivar_type_info.first / 8;
2342960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                        child_byte_offset = 0;
2343bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                        child_is_base_class = true;
23449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                        return ivar_qual_type.getAsOpaquePtr();
23469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    }
23479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
23499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
23509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
23519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            else
23529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
23539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
2354960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2355960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        const uint32_t superclass_idx = child_idx;
23569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (idx < (child_idx + class_interface_decl->ivar_size()))
23589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
23599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
23609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
23629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
23639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if (child_idx == idx)
23649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                {
23659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
23669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    QualType ivar_qual_type(ivar_decl->getType());
23689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_name.assign(ivar_decl->getNameAsString().c_str());
23709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
23729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_size = ivar_type_info.first / 8;
23749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    // Figure out the field offset within the current struct/union/class type
2376960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                    bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
23779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    child_byte_offset = bit_offset / 8;
23789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    return ivar_qual_type.getAsOpaquePtr();
23809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                }
23819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                ++child_idx;
23829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
23839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
23849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
23859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
23869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
23879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
23889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
23899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
23909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
2391960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
2392960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                QualType pointee_type = pointer_type->getPointeeType();
2393960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2394960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
2395960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
2396960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    return GetChildClangTypeAtIndex (ast_context,
2397960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     parent_name,
2398960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
2399960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     idx,
2400960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     transparent_pointers,
2401960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     omit_empty_base_classes,
2402960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_name,
2403960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_size,
2404960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_byte_offset,
2405960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                                                     child_bitfield_bit_size,
2406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
2407bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_is_base_class);
2408960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
2409960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                else
2410960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                {
2411960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (parent_name)
2412960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2413960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name.assign(1, '*');
2414960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_name += parent_name;
2415960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2416960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
2417960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    // We have a pointer to an simple type
2418960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    if (idx == 0)
2419960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    {
2420960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
2421960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        assert(clang_type_info.first % 8 == 0);
2422960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_size = clang_type_info.first / 8;
2423960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        child_byte_offset = 0;
2424960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                        return pointee_type.getAsOpaquePtr();
2425960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                    }
2426960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton                }
24279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
24289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
24299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
24301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const uint64_t element_count = array->getSize().getLimitedValue();
243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (idx < element_count)
243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2439bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    char element_name[64];
2440bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_name.assign(element_name);
244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    assert(field_type_info.first % 8 == 0);
244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_size = field_type_info.first / 8;
244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    child_byte_offset = idx * child_byte_size;
244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return array->getElementType().getAsOpaquePtr();
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
24559db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton
24569db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                // Don't dereference "void *" pointers
24579db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                if (pointee_type->isVoidType())
24589db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton                    return NULL;
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetChildClangTypeAtIndex (ast_context,
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     parent_name,
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     idx,
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     transparent_pointers,
246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes,
246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_name,
246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_size,
247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_byte_offset,
247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     child_bitfield_bit_size,
2472bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_bitfield_bit_offset,
2473bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                     child_is_base_class);
247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (parent_name)
247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name.assign(1, '*');
248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_name += parent_name;
248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // We have a pointer to an simple type
248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (idx == 0)
248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        assert(clang_type_info.first % 8 == 0);
248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_size = clang_type_info.first / 8;
248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_byte_offset = 0;
249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return pointee_type.getAsOpaquePtr();
249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2496f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::LValueReference:
2497f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        case clang::Type::RValueReference:
2498f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            {
2499f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
2500f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                QualType pointee_type(reference_type->getPointeeType());
2501f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
2502f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
2503f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    return GetChildClangTypeAtIndex (ast_context,
2505f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     parent_name,
2506f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     pointee_clang_type,
2507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     idx,
2508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     transparent_pointers,
2509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     omit_empty_base_classes,
2510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_name,
2511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_size,
2512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_byte_offset,
2513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_size,
2514f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_bitfield_bit_offset,
2515f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                     child_is_base_class);
2516f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2517f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                else
2518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (parent_name)
2520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name.assign(1, '&');
2522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_name += parent_name;
2523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2524f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2525f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer to an simple type
2526f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (idx == 0)
2527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2528f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
2529f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        assert(clang_type_info.first % 8 == 0);
2530f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_size = clang_type_info.first / 8;
2531f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        child_byte_offset = 0;
2532f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        return pointee_type.getAsOpaquePtr();
2533f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2534f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
2535f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            }
2536f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            break;
2537f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
25381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetChildClangTypeAtIndex (ast_context,
254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             parent_name,
25419e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                             cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             idx,
254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             transparent_pointers,
254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             omit_empty_base_classes,
254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_name,
254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_size,
254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_byte_offset,
254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             child_bitfield_bit_size,
2549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_bitfield_bit_offset,
2550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                             child_is_base_class);
255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2557f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton    return NULL;
255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_bases = 0;
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (omit_empty_base_classes)
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 base_class != base_class_end;
257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                 ++base_class)
257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Skip empty base classes
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (omit_empty_base_classes)
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (BaseSpecifierIsEmpty (base_class))
258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        continue;
258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++num_bases;
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_bases = cxx_record_decl->getNumBases();
259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_bases;
259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase
259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXBaseSpecifier *base_spec,
260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = 0;
260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *super_name = record_decl->getNameAsCString();
260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (omit_empty_base_classes)
261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (BaseSpecifierIsEmpty (base_class))
262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    continue;
262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx,
262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (base_class == base_spec)
263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return child_idx;
263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ++child_idx;
263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild
264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const RecordDecl *record_decl,
264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NamedDecl *canonical_decl,
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (cxx_record_decl)
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             base_class != base_class_end;
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//             ++base_class)
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        {
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (omit_empty_base_classes)
266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (BaseSpecifierIsEmpty (base_class))
266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    continue;
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    record_decl->getNameAsCString(),
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    canonical_decl->getNameAsCString(),
266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    child_idx,
266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            if (curr_base_class_decl == canonical_decl)
267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                return child_idx;
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            ++child_idx;
267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        }
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    const uint32_t num_bases = child_idx;
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RecordDecl::field_iterator field, field_end;
268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         field != field_end;
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++field, ++child_idx)
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    record_decl->getNameAsCString(),
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    canonical_decl->getNameAsCString(),
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_idx - num_bases,
269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    field->getNameAsCString());
269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (field->getCanonicalDecl() == canonical_decl)
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return child_idx;
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include
270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type"
270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member.
270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class A
270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    public:
270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_a;
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        int m_b;
270924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class B
271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    class C :
271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public B,
271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        public A
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    {
271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    };
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked
272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it:
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with:
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1,  1 }
272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with:
273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0,  1 }
273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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)
273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName
273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
2738462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes,
274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t>& child_indexes
274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
274703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
274803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // We have to add on the number of base classes to this index!
277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const RecordDecl *parent_record_decl = cxx_record_decl;
277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    // Didn't find things easily, lets let clang do its thang...
278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DeclarationName decl_name(&ident_ref);
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXBasePaths paths;
278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       decl_name.getAsOpaquePtr(),
278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                       paths))
279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        for (path = paths.begin(); path != path_end; ++path)
279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            const size_t num_path_elements = path->size();
279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (size_t e=0; e<num_path_elements; ++e)
279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                CXXBasePathElement elem = (*path)[e];
279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            DeclContext::lookup_iterator named_decl_pos;
281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            for (named_decl_pos = path->Decls.first;
281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 named_decl_pos != path->Decls.second && parent_record_decl;
281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 ++named_decl_pos)
281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                if (child_idx == UINT32_MAX)
282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.clear();
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    return 0;
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                else
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                {
282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    child_indexes.push_back (child_idx);
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                }
282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_indexes.size();
283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
28389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
28399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
28409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
28419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
28429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
28439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
28449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
28459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
28469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
28479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
28499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
28509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
28519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
28529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
2853823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
28549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
28559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
28569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
28589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
28599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
28609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
28619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
28629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                child_indexes.push_back (child_idx);
28649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
28659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
28669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
28679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
28699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
28709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // The super class index is always zero for ObjC classes,
28719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // so we push it onto the child indexes in case we find
28729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // an ivar in our superclass...
28739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.push_back (0);
28749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (GetIndexOfChildMemberWithName (ast_context,
28769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
28779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               name,
28789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               omit_empty_base_classes,
28799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                               child_indexes))
28809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
28819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // We did find an ivar in a superclass so just
28829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                // return the results!
28839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_indexes.size();
28849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
28859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // We didn't find an ivar matching "name" in our
28879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // superclass, pop the superclass zero index that
28889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            // we pushed on above.
28899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            child_indexes.pop_back();
28909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
28919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
28929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
28939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
28949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
28959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
28969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
28979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
28989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildMemberWithName (ast_context,
28999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
29009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      name,
29019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      omit_empty_base_classes,
29029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                      child_indexes);
29039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
29049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
29059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
29071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
29421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
29431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          reference_type->getPointeeType().getAsOpaquePtr(),
295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildMemberWithName (ast_context,
296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          name,
296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          omit_empty_base_classes,
297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          child_indexes);
297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildMemberWithName (ast_context,
29959e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                                  cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  name,
299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  omit_empty_base_classes,
299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                  child_indexes);
299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name
301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names.
301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context,
3016462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t clang_type,
301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type && name && name[0])
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
30249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
302503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
30269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
302703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Record:
303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const RecordDecl *record_decl = record_type->getDecl();
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                assert(record_decl);
303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                uint32_t child_idx = 0;
303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (cxx_record_decl)
304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         base_class != base_class_end;
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         ++base_class)
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // Skip empty base classes
304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            continue;
305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (base_class->getType().getAsString().compare (name) == 0)
305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            return child_idx;
305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        ++child_idx;
305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Try and find a field that matches NAME
305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                RecordDecl::field_iterator field, field_end;
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                StringRef name_sref(name);
306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     field != field_end;
306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     ++field, ++child_idx)
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (field->getName().equals (name_sref))
306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return child_idx;
306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObject:
30729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCInterface:
30739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
30749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                StringRef name_sref(name);
30759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
30769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                assert (objc_class_type);
30779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                if (objc_class_type)
30789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                {
30799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    uint32_t child_idx = 0;
30809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
30819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
30829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    if (class_interface_decl)
30839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    {
30849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
30859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
30869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
30879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
30889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
30899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
30909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
30919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (ivar_decl->getName().equals (name_sref))
30929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            {
30939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                if ((!omit_empty_base_classes && superclass_interface_decl) ||
30949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
30959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                    ++child_idx;
30969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
30979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return child_idx;
30989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            }
30999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
31009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        if (superclass_interface_decl)
31029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        {
31039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                            if (superclass_interface_decl->getName().equals (name_sref))
31049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                return 0;
31059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                        }
31069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                    }
31079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                }
31089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
31099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
31109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        case clang::Type::ObjCObjectPointer:
31129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            {
31139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                return GetIndexOfChildWithName (ast_context,
31149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
31159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                name,
31169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton                                                omit_empty_base_classes);
31179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            }
31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton            break;
31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
31201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ConstantArray:
312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                const uint64_t element_count = array->getSize().getLimitedValue();
312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (idx < element_count)
312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    char element_name[32];
313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_name.assign(element_name);
313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    assert(field_type_info.first % 8 == 0);
313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_size = field_type_info.first / 8;
313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    child_byte_offset = idx * child_byte_size;
313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return array->getElementType().getAsOpaquePtr();
313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//        case clang::Type::MemberPointerType:
314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            {
314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                QualType pointee_type = mem_ptr_type->getPointeeType();
314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                {
314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    return GetIndexOfChildWithName (ast_context,
314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                    name);
315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                }
315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            }
315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
31551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::LValueReference:
31561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::RValueReference:
315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = reference_type->getPointeeType();
316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    reference_type->getPointeeType().getAsOpaquePtr(),
316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                QualType pointee_type = pointer_type->getPointeeType();
317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return GetIndexOfChildWithName (ast_context,
317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    name,
318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                    omit_empty_base_classes);
318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (parent_name)
318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name.assign(1, '*');
318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_name += parent_name;
318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    // We have a pointer to an simple type
319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    if (idx == 0)
319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    {
319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        assert(clang_type_info.first % 8 == 0);
319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_size = clang_type_info.first / 8;
319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        child_byte_offset = 0;
319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                        return pointee_type.getAsOpaquePtr();
319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                    }
320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return GetIndexOfChildWithName (ast_context,
32069e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            name,
320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            omit_empty_base_classes);
320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return UINT32_MAX;
321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType
321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3220462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (tag_clang_type)
322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
32251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = tag_qual_type.getTypePtr();
322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(clang_type);
322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions
324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext *
3247462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type)
324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
325303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
325403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionNoProto:          break;
32579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::FunctionProto:            break;
32589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::IncompleteArray:          break;
32599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::VariableArray:            break;
32609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ConstantArray:            break;
32619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ExtVector:                break;
32629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Vector:                   break;
32639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Builtin:                  break;
32649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::BlockPointer:             break;
32659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Pointer:                  break;
32669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::LValueReference:          break;
32679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::RValueReference:          break;
32689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::MemberPointer:            break;
32699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Complex:                  break;
32709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObject:               break;
32719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
32729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
32739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
32749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
32759e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
32769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
32779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOfExpr:               break;
32789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TypeOf:                   break;
32799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::Decltype:                 break;
32809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    //case clang::Type::QualifiedName:          break;
32819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    case clang::Type::TemplateSpecialization:   break;
328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No DeclContext in this type...
328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations
328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl *
329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types
330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl *
3308462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (name)
331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (name && name[0])
331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (&ast_context->Idents.get(name)),
332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return FunctionDecl::Create(*ast_context,
333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        ast_context->getTranslationUnitDecl(),
333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        SourceLocation(),
333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        DeclarationName (),
333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        QualType::getFromOpaquePtr(function_clang_type),
333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        NULL,
333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        (FunctionDecl::StorageClass)storage,
333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        is_inline);
333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3343462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3344462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context,
3345462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t result_type,
3346462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                     clang_type_t *args,
33472ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned num_args,
33482ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     bool is_variadic,
33492ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                     unsigned type_quals)
335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<QualType> qual_type_args;
335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (unsigned i=0; i<num_args; ++i)
335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Detect calling convention in DWARF?
335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
335853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton                                        qual_type_args.empty() ? NULL : &qual_type_args.front(),
335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        qual_type_args.size(),
33602ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                        is_variadic,
33612ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                        type_quals,
336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasExceptionSpec
336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        false,  // hasAnyExceptionSpec,
336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // NumExs
336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        0,      // const QualType *ExArray
336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                        FunctionType::ExtInfo ()).getAsOpaquePtr();    // NoReturn);
336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl *
3370462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ParmVarDecl::Create(*ast_context,
337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                ast_context->getTranslationUnitDecl(),
337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                SourceLocation(),
337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                name && name[0] ? &ast_context->Idents.get(name) : NULL,
33782ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan                                QualType::getFromOpaquePtr(param_type),
337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                NULL,
338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                (VarDecl::StorageClass)storage,
338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                0);
338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (function_decl)
338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        function_decl->setParams (params, num_params);
339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types
339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3395462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3396462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (element_type)
339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        llvm::APInt ap_element_count (64, element_count);
340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ap_element_count,
340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 ArrayType::Normal,
340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                 0).getAsOpaquePtr(); // ElemQuals
340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl
341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3415462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
34201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *t = qual_type.getTypePtr();
342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (t)
342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            TagType *tag_type = dyn_cast<TagType>(t);
342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (tag_type)
342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                TagDecl *tag_decl = tag_type->getDecl();
342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (tag_decl)
342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    tag_decl->startDefinition();
343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3439462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
344455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
344555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
344655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
344755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (cxx_record_decl)
344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
344955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            cxx_record_decl->completeDefinition();
345055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
345155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            return true;
345255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        }
345355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
345404325065a00f646527db85e9bc751da29ac53b23Sean Callanan        ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
345504325065a00f646527db85e9bc751da29ac53b23Sean Callanan
345604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        if (objc_class_type)
345704325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
345804325065a00f646527db85e9bc751da29ac53b23Sean Callanan            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
345904325065a00f646527db85e9bc751da29ac53b23Sean Callanan
346004325065a00f646527db85e9bc751da29ac53b23Sean Callanan            class_interface_decl->setForwardDecl(false);
346104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
346204325065a00f646527db85e9bc751da29ac53b23Sean Callanan
346355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
346455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
346555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        if (enum_type)
346655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton        {
346755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
346855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
346955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton            if (enum_decl)
347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
347155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                /// TODO This really needs to be fixed.
347255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
347355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumPositiveBits = 1;
347455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                unsigned NumNegativeBits = 0;
347555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton
347648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                ASTContext *ast_context = getASTContext();
347748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
347848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                QualType promotion_qual_type;
347948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // If the enum integer type is less than an integer in bit width,
348048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                // then we must promote it to an integer size.
348148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                if (ast_context->getTypeSize(enum_decl->getIntegerType()) < ast_context->getTypeSize(ast_context->IntTy))
348248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                {
348348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    if (enum_decl->getIntegerType()->isSignedIntegerType())
348448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                        promotion_qual_type = ast_context->IntTy;
348548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    else
348648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                        promotion_qual_type = ast_context->UnsignedIntTy;
348748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                }
348848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                else
348948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                    promotion_qual_type = enum_decl->getIntegerType();
349048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
349148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
349255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton                return true;
349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
349524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
349924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types
350124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3502462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
35030d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType
35040d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton(
35050d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const char *name,
35060d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    DeclContext *decl_ctx,
35070d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    const Declaration &decl,
35080d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton    clang_type_t integer_qual_type
35090d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton)
351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: Do something intelligent with the Declaration object passed in
351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // like maybe filling in the SourceLocation with it...
351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (ast_context != NULL);
351548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
351648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    // TODO: ask about these...
351748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsScoped = false;
351848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton//    const bool IsFixed = false;
351948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton
352048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast_context,
35210d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton                                            decl_ctx,
352248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
352348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            name && name[0] ? &ast_context->Idents.get(name) : NULL,
352448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton                                            SourceLocation(),
35259e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            NULL,
35269e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScoped
35279e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false,  // IsScopedUsingClassTag
35289e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan                                            false); // IsFixed
352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_decl)
3530e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    {
3531e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        // TODO: check if we should be setting the promotion type too?
3532e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
3534e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton    }
353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3538462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3539462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
3540462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{
3541462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
3542462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
3543462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang::Type *clang_type = enum_qual_type.getTypePtr();
3544462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (clang_type)
3545462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    {
3546462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
3547462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (enum_type)
3548462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        {
3549462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            EnumDecl *enum_decl = enum_type->getDecl();
3550462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            if (enum_decl)
3551462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                return enum_decl->getIntegerType().getAsOpaquePtr();
3552462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        }
3553462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    }
3554462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return NULL;
3555462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton}
355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType
355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3559462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enum_clang_type,
3560462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    clang_type_t enumerator_clang_type,
356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Declaration &decl,
356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *name,
356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int64_t enum_value,
356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t enum_value_bit_size
356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (enum_clang_type && enumerator_clang_type && name)
356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // TODO: Do something intelligent with the Declaration object passed in
357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // like maybe filling in the SourceLocation with it...
357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        clang::Type *clang_type = enum_qual_type.getTypePtr();
357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (clang_type)
358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (enum_type)
358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                enum_llvm_apsint = enum_value;
358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                EnumConstantDecl *enumerator_decl =
358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    EnumConstantDecl::Create(*ast_context,
358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_type->getDecl(),
359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             SourceLocation(),
359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             name ? &identifier_table->get(name) : NULL,    // Identifier
359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             QualType::getFromOpaquePtr(enumerator_clang_type),
359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             NULL,
359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             enum_llvm_apsint);
359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (enumerator_decl)
359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    enum_type->getDecl()->addDecl(enumerator_decl);
359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return true;
360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References
360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3609462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3610462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type)
361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3612427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return CreatePointerType (getASTContext(), clang_type);
3613427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3614427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3615427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t
3616427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
3617427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
3618427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (ast && clang_type)
36197b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    {
36207b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
36217b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
362203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
362303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
36247b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        {
36257b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCObject:
36267b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        case clang::Type::ObjCInterface:
3627427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
36287b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton
36297b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        default:
3630427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return ast->getPointerType(qual_type).getAsOpaquePtr();
36317b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton        }
36327b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton    }
363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3636462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
36376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
36386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
36416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3645462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
36466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
36476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                            clang_type_t clang_type)
364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
36506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3654462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3655462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
3656fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{
3657fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    if (clang_pointee_type && clang_pointee_type)
3658fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
3659fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
3660fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton    return NULL;
3661fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton}
3662fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton
366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize ()
366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ASTContext *ast_context = getASTContext();
366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ast_context->getTypeSize(ast_context->VoidPtrTy);
366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3671462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type == NULL)
367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
367703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
367803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
368004325065a00f646527db85e9bc751da29ac53b23Sean Callanan    case clang::Type::Builtin:
368104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        switch (cast<clang::BuiltinType>(qual_type)->getKind())
368204325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
368304325065a00f646527db85e9bc751da29ac53b23Sean Callanan        default:
368404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            break;
368504325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCId:
368604325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::BuiltinType::ObjCClass:
368704325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return true;
368804325065a00f646527db85e9bc751da29ac53b23Sean Callanan        }
368904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        return false;
36901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ObjCObjectPointer:
369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
36941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::BlockPointer:
369524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
369624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
36981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Pointer:
369924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
370124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
37021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::MemberPointer:
370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
37061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::LValueReference:
370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
37101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::RValueReference:
371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (target_type)
371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
37141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::Typedef:
37159e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
371824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3723462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
372724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
372824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
372924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
373024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
373124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (builtin_type)
373224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (builtin_type->isInteger())
373424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            is_signed = builtin_type->isSignedInteger();
373524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
373624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3743462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type)
374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
374624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
374803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
374903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
375024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
375104325065a00f646527db85e9bc751da29ac53b23Sean Callanan        case clang::Type::Builtin:
375204325065a00f646527db85e9bc751da29ac53b23Sean Callanan            switch (cast<clang::BuiltinType>(qual_type)->getKind())
375304325065a00f646527db85e9bc751da29ac53b23Sean Callanan            {
375404325065a00f646527db85e9bc751da29ac53b23Sean Callanan            default:
375504325065a00f646527db85e9bc751da29ac53b23Sean Callanan                break;
375604325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCId:
375704325065a00f646527db85e9bc751da29ac53b23Sean Callanan            case clang::BuiltinType::ObjCClass:
375804325065a00f646527db85e9bc751da29ac53b23Sean Callanan                return true;
375904325065a00f646527db85e9bc751da29ac53b23Sean Callanan            }
376004325065a00f646527db85e9bc751da29ac53b23Sean Callanan            return false;
37611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::ObjCObjectPointer:
376224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
376324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
376424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
37651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::BlockPointer:
376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
37691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Pointer:
377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
377124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
377224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
37731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::MemberPointer:
377424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (target_type)
377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
377624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
37771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case clang::Type::Typedef:
37789e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
378324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3787462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
378824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
378924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
379124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
379224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
379324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            clang::BuiltinType::Kind kind = BT->getKind();
379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 1;
379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = 2;
380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = true;
380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                count = VT->getNumElements();
381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                is_complex = false;
381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3825bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
3826bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool
3827bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
3828bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
3829bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (clang_type)
3830bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
3831bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3832bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
3833bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3834bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (cxx_record_decl)
3835bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
3836bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
3837bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            return true;
3838bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
3839bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
3840bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    class_name.clear();
3841bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    return false;
3842bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
3843bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
3844bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
38451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
3846462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type)
38471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
38481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
38491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
38501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
38511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->getAsCXXRecordDecl() != NULL)
38521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
38531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
38541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
38551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
38561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
38571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool
3858462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type)
38591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
38601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    if (clang_type)
38611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
38621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
38631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        if (qual_type->isObjCObjectOrInterfaceType())
38641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton            return true;
38651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
38661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    return false;
38671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton}
38681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
38691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
3870f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool
3871f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type)
3872f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
3873f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
3874f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return QualType::getFromOpaquePtr(clang_type)->isCharType();
3875f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return false;
3876f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3879462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3881f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t pointee_or_element_clang_type = NULL;
3882f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
3883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
3884f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (pointee_or_element_clang_type == NULL)
3885f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        return false;
3886f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
3887f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3889f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
3890f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
3891f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
3894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            if (type_flags.Test (eTypeIsArray))
389524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3896f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We know the size of the array and it could be a C string
3897f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // since it is an array of characters
3898f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
3899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
3901f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
3903f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                length = 0;
3904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                return true;
390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3913462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
391403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
391503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    if (clang_type)
391603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
391703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
391803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
391903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (qual_type->isFunctionPointerType())
392003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            return true;
392103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
392203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
392303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        switch (type_class)
392403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
392503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::Typedef:
39269e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
392703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
392803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::LValueReference:
392903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        case clang::Type::RValueReference:
393003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            {
393103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
393203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                if (reference_type)
393303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
393403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
393503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            break;
393603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
393703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
393803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return false;
393903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
394003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
3941f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t
3942f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type)
3943f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
3944f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    if (clang_type)
3945f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
3946f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
3947f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (array)
3948f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return array->getSize().getLimitedValue();
3949f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
3950f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return 0;
3951f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
395203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
395303e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool
3954462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!clang_type)
395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
396103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
396203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    switch (type_class)
396324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::ConstantArray:
396524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
396624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
396724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
396824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::IncompleteArray:
397124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
397224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::VariableArray:
397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
39811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton    case clang::Type::DependentSizedArray:
398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (member_type)
398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (size)
398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            *size = 0;
398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
398724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
399124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
399224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs
399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3994462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t
3995462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
399724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
399824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ASTContext *ast_context = getASTContext();
400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IdentifierTable *identifier_table = getIdentifierTable();
400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (ast_context != NULL);
400324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (identifier_table != NULL);
400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (decl_ctx == NULL)
400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            decl_ctx = ast_context->getTranslationUnitDecl();
400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        TypedefDecl *decl = TypedefDecl::Create(*ast_context,
400724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                decl_ctx,
400824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                SourceLocation(),
400924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                name ? &identifier_table->get(name) : NULL, // Identifier
401024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                ast_context->CreateTypeSourceInfo(qual_type));
401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get a uniqued QualType for the typedef decl type
401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return ast_context->getTypedefType (decl).getAsOpaquePtr();
401424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
401524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string
4020462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string return_name;
402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type));
402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4026462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (typedef_type)
402824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4029462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        const TypedefDecl *typedef_decl = typedef_type->getDecl();
403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = typedef_decl->getQualifiedNameAsString();
403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
403224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return_name = qual_type.getAsString();
403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
403624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return return_name;
403824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
403924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
404124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
4047462d4147f3bb9141bf62d904f58a623db00669dfGreg 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)
404824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
404924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
405024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
405124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
405224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
405324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
405624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
405724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
405824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
406024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
406124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
406224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
406324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
406424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
406524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
406624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
407024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
407424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
407524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
407624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
407724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
407824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
407924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
408024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
408124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
4082462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
408324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clang_type)
408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
408624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
408724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t count = 0;
408824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool is_complex = false;
408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
409124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // TODO: handle complex and vector types
409224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (count != 1)
409324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
409424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
409524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StringRef s_sref(s);
409624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
409724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
409824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t bit_size = ast_context->getTypeSize (qual_type);
409924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const uint64_t byte_size = bit_size / 8;
410024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst_size >= byte_size)
410124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
410224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (bit_size == sizeof(float)*8)
410324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
410424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    float float32 = ap_float.convertToFloat();
410524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, &float32, byte_size);
410624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
410724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
410824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else if (bit_size >= 64)
410924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
411024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
411124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    ::memcpy (dst, ap_int.getRawData(), byte_size);
411224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return byte_size;
411324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
411424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
411524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
411624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
411724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
411824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4119a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4120a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned
4121462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
4122a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{
4123a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    assert (clang_type);
4124a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4125a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
4126a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
4127a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan    return qual_type.getQualifiers().getCVRQualifiers();
4128a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan}
4129