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