ClangASTContext.cpp revision 7b54103814527f5eeaa022d1a8a20cf8d2d864e5
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include "lldb/Symbol/ClangASTContext.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 17bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#define NDEBUG 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTImporter.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/CXXInheritance.h" 2184f8075072eef306234f8109573067647735c111Greg Clayton#include "clang/AST/DeclObjC.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h" 31bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h> 36f05633b35544b5d095feb05680c8728be087e441Eli Friedman 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4184f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 4284f8075072eef306234f8109573067647735c111Greg ClaytonConvertAccessTypeToAccessSpecifier (ClangASTContext::AccessType access) 4384f8075072eef306234f8109573067647735c111Greg Clayton{ 4484f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 4584f8075072eef306234f8109573067647735c111Greg Clayton { 4684f8075072eef306234f8109573067647735c111Greg Clayton default: break; 4784f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessNone: return AS_none; 4884f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessPublic: return AS_public; 4984f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessPrivate: return AS_private; 5084f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessProtected: return AS_protected; 5184f8075072eef306234f8109573067647735c111Greg Clayton } 5284f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 5384f8075072eef306234f8109573067647735c111Greg Clayton} 5484f8075072eef306234f8109573067647735c111Greg Clayton 5584f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 5684f8075072eef306234f8109573067647735c111Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (ClangASTContext::AccessType access) 5784f8075072eef306234f8109573067647735c111Greg Clayton{ 5884f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 5984f8075072eef306234f8109573067647735c111Greg Clayton { 6084f8075072eef306234f8109573067647735c111Greg Clayton default: break; 6184f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessNone: return ObjCIvarDecl::None; 6284f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessPublic: return ObjCIvarDecl::Public; 6384f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessPrivate: return ObjCIvarDecl::Private; 6484f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessProtected: return ObjCIvarDecl::Protected; 6584f8075072eef306234f8109573067647735c111Greg Clayton case ClangASTContext::eAccessPackage: return ObjCIvarDecl::Package; 6684f8075072eef306234f8109573067647735c111Greg Clayton } 6784f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 6884f8075072eef306234f8109573067647735c111Greg Clayton} 6984f8075072eef306234f8109573067647735c111Greg Clayton 7084f8075072eef306234f8109573067647735c111Greg Clayton 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 75e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 83e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 85e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 86e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 87e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 88e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 97e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 98e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(0 && "Invalid input kind!"); 100e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 103e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 104e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 105e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 106e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 110e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 112e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 113e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.setVisibilityMode(LangOptions::Default); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 235e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) : 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap(), 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap() 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_ast_context_ap.get() == NULL) 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset( 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new ASTContext( 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getLanguageOptions(), 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSourceManager(), 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getTargetInfo(), 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getIdentifierTable(), 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSelectorTable(), 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getBuiltinContext())); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ast_context_ap.get(); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 336e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 337e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 3541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic())); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(new Diagnostic()); 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type) 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, uint32_t bit_size) 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast_context, lldb::Encoding encoding, uint32_t bit_size) 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ast_context) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case lldb::eEncodingInvalid: 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case lldb::eEncodingUint: 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case lldb::eEncodingSint: 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case lldb::eEncodingIEEE754: 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case lldb::eEncodingVector: 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context) 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy)) 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->BoolTy.getAsOpaquePtr(); 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy)) 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatComplexTy.getAsOpaquePtr(); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy)) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleComplexTy.getAsOpaquePtr(); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy)) 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleComplexTy.getAsOpaquePtr(); 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "int") || 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed int")) 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "long int") || 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "long long int") || 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed long long")) 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "short") || 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short int") || 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed short") || 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short signed int")) 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "char") || 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed char")) 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 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 (streq(type_name, "wchar_t")) 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy)) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->WCharTy.getAsOpaquePtr(); 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned int")) 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned int") || 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "long unsigned int") || 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "unsigned long long")) 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned short") || 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short unsigned int")) 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned char")) 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidBuiltInType() 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->VoidTy.getAsOpaquePtr(); 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (clang::ASTContext *ast_context, bool is_const) 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType void_ptr_type(ast_context->VoidPtrTy); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CopyType(clang::ASTContext *dest_context, 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *source_context, 69584f8075072eef306234f8109573067647735c111Greg Clayton void *clang_type) 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Diagnostic diagnostics; 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileManager file_manager; 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTImporter importer(diagnostics, 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *dest_context, file_manager, 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *source_context, file_manager); 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type)); 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ret.getAsOpaquePtr(); 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7068d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 7078d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean CallananClangASTContext::AreTypesSame(clang::ASTContext *ast_context, 7085510dddc33260a991284ef81ca343594f23262e8Sean Callanan void *type1, 7095510dddc33260a991284ef81ca343594f23262e8Sean Callanan void *type2) 7105510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 7115510dddc33260a991284ef81ca343594f23262e8Sean Callanan return ast_context->hasSameType(QualType::getFromOpaquePtr(type1), 7125510dddc33260a991284ef81ca343594f23262e8Sean Callanan QualType::getFromOpaquePtr(type2)); 7135510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 7145510dddc33260a991284ef81ca343594f23262e8Sean Callanan 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddConstModifier (void *clang_type) 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddRestrictModifier (void *clang_type) 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddVolatileModifier (void *clang_type) 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 7569488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, lldb::LanguageType language) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 7659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (language == lldb::eLanguageTypeObjC) 7669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 7679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isForwardDecl = false; 7689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 7699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 7709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 7719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context, 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL); 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(decl).getAsOpaquePtr(); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 78784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 78884f8075072eef306234f8109573067647735c111Greg Clayton( 78984f8075072eef306234f8109573067647735c111Greg Clayton void *record_clang_type, 79084f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 79184f8075072eef306234f8109573067647735c111Greg Clayton void *field_type, 79284f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 79384f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 79484f8075072eef306234f8109573067647735c111Greg Clayton) 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setEmpty (false); 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_width = new (*ast_context)IntegerLiteral (bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82684f8075072eef306234f8109573067647735c111Greg Clayton FieldDecl *field = FieldDecl::Create (*ast_context, 82784f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 82884f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 82984f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 83084f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 83184f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 83284f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 83384f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83584f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 8449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 8459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 8469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 8479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 8489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isSynthesized = false; 8499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ClangASTContext::AddObjCClassIVar (record_clang_type, 8509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 8519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 8529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 8539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 8549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton isSynthesized); 8559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 8569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context == NULL || field == NULL) 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context)) 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetDefaultAccessForRecordFields (void *clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type) 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 9261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = qual_type.getTypePtr(); 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl) 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx; 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++field_idx) 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no accessibility was assigned, assign the correct one 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field->setAccess ((AccessSpecifier)default_accessibility); 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 95484f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateBaseClassSpecifier (void *base_class_type, AccessType access, bool is_virtual, bool base_of_class) 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return new CXXBaseSpecifier(SourceRange(), is_virtual, base_of_class, (AccessSpecifier)access, QualType::getFromOpaquePtr(base_class_type)); 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 961e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 962e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 963e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 964e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 965e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 966e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 967e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 968e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 969e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 970e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetBaseClassesForClassType (void *class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl()); 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //cxx_record_decl->setEmpty (false); 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setBases(base_classes, num_base_classes); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99484f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 99584f8075072eef306234f8109573067647735c111Greg Clayton 99684f8075072eef306234f8109573067647735c111Greg Claytonvoid * 99784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 99884f8075072eef306234f8109573067647735c111Greg Clayton( 99984f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 100084f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 100184f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 100284f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 100384f8075072eef306234f8109573067647735c111Greg Clayton) 100484f8075072eef306234f8109573067647735c111Greg Clayton{ 100584f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 100684f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 100784f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 100884f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 100984f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx = ast_context->getTranslationUnitDecl(); 101084f8075072eef306234f8109573067647735c111Greg Clayton 101184f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 101284f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 101384f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 101484f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 101584f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 101684f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context, 101784f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 101884f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 101984f8075072eef306234f8109573067647735c111Greg Clayton &ast_context->Idents.get(name), 102084f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 102184f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 102284f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 10239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 10249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr(); 102584f8075072eef306234f8109573067647735c111Greg Clayton} 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102784f8075072eef306234f8109573067647735c111Greg Claytonbool 102884f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::SetObjCSuperClass (void *class_opaque_type, void *super_opaque_type) 102984f8075072eef306234f8109573067647735c111Greg Clayton{ 103084f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 103184f8075072eef306234f8109573067647735c111Greg Clayton { 103284f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 103384f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 103484f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 103584f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 103684f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 103784f8075072eef306234f8109573067647735c111Greg Clayton { 103884f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 103984f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 104084f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 104184f8075072eef306234f8109573067647735c111Greg Clayton { 104284f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 104384f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 104484f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 104584f8075072eef306234f8109573067647735c111Greg Clayton { 104684f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 104784f8075072eef306234f8109573067647735c111Greg Clayton return true; 104884f8075072eef306234f8109573067647735c111Greg Clayton } 104984f8075072eef306234f8109573067647735c111Greg Clayton } 105084f8075072eef306234f8109573067647735c111Greg Clayton } 105184f8075072eef306234f8109573067647735c111Greg Clayton } 105284f8075072eef306234f8109573067647735c111Greg Clayton return false; 105384f8075072eef306234f8109573067647735c111Greg Clayton} 105484f8075072eef306234f8109573067647735c111Greg Clayton 105584f8075072eef306234f8109573067647735c111Greg Clayton 105684f8075072eef306234f8109573067647735c111Greg Claytonbool 105784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 105884f8075072eef306234f8109573067647735c111Greg Clayton( 105984f8075072eef306234f8109573067647735c111Greg Clayton void *class_opaque_type, 106084f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 106184f8075072eef306234f8109573067647735c111Greg Clayton void *ivar_opaque_type, 106284f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 106384f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 106484f8075072eef306234f8109573067647735c111Greg Clayton bool isSynthesized 106584f8075072eef306234f8109573067647735c111Greg Clayton) 106684f8075072eef306234f8109573067647735c111Greg Clayton{ 106784f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 106884f8075072eef306234f8109573067647735c111Greg Clayton return false; 106984f8075072eef306234f8109573067647735c111Greg Clayton 107084f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 107184f8075072eef306234f8109573067647735c111Greg Clayton IdentifierTable *identifier_table = getIdentifierTable(); 107284f8075072eef306234f8109573067647735c111Greg Clayton 107384f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 107484f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 107584f8075072eef306234f8109573067647735c111Greg Clayton 107684f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 107784f8075072eef306234f8109573067647735c111Greg Clayton 107884f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 107984f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 108084f8075072eef306234f8109573067647735c111Greg Clayton { 108184f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 108284f8075072eef306234f8109573067647735c111Greg Clayton 108384f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 108484f8075072eef306234f8109573067647735c111Greg Clayton { 108584f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 108684f8075072eef306234f8109573067647735c111Greg Clayton 108784f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 108884f8075072eef306234f8109573067647735c111Greg Clayton { 108984f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 109084f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 109184f8075072eef306234f8109573067647735c111Greg Clayton { 109284f8075072eef306234f8109573067647735c111Greg Clayton APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 109384f8075072eef306234f8109573067647735c111Greg Clayton bit_width = new (*ast_context)IntegerLiteral (bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 109484f8075072eef306234f8109573067647735c111Greg Clayton } 109584f8075072eef306234f8109573067647735c111Greg Clayton 10969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context, 10979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 10989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 10999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 11009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 11019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 11029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 11039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 11049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton isSynthesized); 11059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 11079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 11089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 11099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 11109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 111184f8075072eef306234f8109573067647735c111Greg Clayton } 111284f8075072eef306234f8109573067647735c111Greg Clayton } 111384f8075072eef306234f8109573067647735c111Greg Clayton } 111484f8075072eef306234f8109573067647735c111Greg Clayton return false; 111584f8075072eef306234f8109573067647735c111Greg Clayton} 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11189488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 11199488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCTypeHasIVars (void *class_opaque_type, bool check_superclass) 11209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 11219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 11229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 11249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 11259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 11269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 11279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 11299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 11309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 11319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 11329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 11339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11349488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 11359488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 11369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 11379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 11389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 11399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 11409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 11419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 11439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 11449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 11459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 11469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 11479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 11489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 11499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 11509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsAggregateType (void *clang_type) 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type->isAggregateType ()) 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 11671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 11681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 11691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 11701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 11711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 11729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 11739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 11749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_classes) 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type == NULL) 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 11959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 11969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 12409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 12419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 12439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 12449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 12459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 12479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 12489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 12499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 12519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 12529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 12539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 12559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 12579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 12589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 12609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 12619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 12639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 12649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 12689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 12699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 12709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ClangASTContext::GetNumChildren (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 12719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 12729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 12731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 12819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 12829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If this type points to a simple type, then it has 1 child 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = 1; 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes); 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *parent_clang_type, 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_offset 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *parent_clang_type, 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_offset 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes)) 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (parent_qual_type->getTypeClass()) 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getVBaseClassOffset(base_class_decl); 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getBaseClassOffset(base_class_decl); 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType()); 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType()); 143154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size)) 143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 14489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 14499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 14519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 14529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 14539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 14559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 14569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 14589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl); 14619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 14629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 14639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 14659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::GetNumChildren(superclass_interface_decl, omit_empty_base_classes) > 0) 14679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 14699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl)); 14719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 14749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 14769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 14789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 14809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx); 14819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 14829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 14849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 14859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 14879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 14889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 14899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 14909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 14949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 14969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 14989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 15009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 15029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 15049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 15069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 15089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 15109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 15129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx); 15139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 15149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 15169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 15189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 15249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 15269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetChildClangTypeAtIndex (ast_context, 15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton parent_name, 15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 15309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton idx, 15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton transparent_pointers, 15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 15339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name, 15349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size, 15359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset, 15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_bitfield_bit_size, 15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_bitfield_bit_offset); 15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 15409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char element_name[32]; 155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(element_name); 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(field_type_info.first % 8 == 0); 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = idx * child_byte_size; 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return array->getElementType().getAsOpaquePtr(); 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1620f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false; 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *clang_type, 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name)); 184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 19009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 19099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 19139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 19149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 19169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 19189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 19209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 19229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 19239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 19249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 19269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 19279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 19319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 19339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 19349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 19359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 19369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (GetIndexOfChildMemberWithName (ast_context, 19389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 19399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 19409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 19419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 19429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 19449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 19459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 19469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 19499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 19509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 19519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 19529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 19599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildMemberWithName (ast_context, 19619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 19629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 19639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 19649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 19659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 20041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 20051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *clang_type, 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 20869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type::TypeClass qual_type_class = qual_type->getTypeClass(); 20889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (qual_type_class) 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 21349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 21359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 21379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 21389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 21399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 21409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 21429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 21439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 21459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 21479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 21489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 21509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 21529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 21549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 21569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 21579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 21589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 21609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 21649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 21669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 21679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 21729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 21749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildWithName (ast_context, 21769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 22171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 22181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTagTypeKind (void *tag_clang_type, int kind) 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 22871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetDeclContextForType (void *clang_type) 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 23259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 23269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 23279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 23289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 23299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 23309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 23319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 23329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 23339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 23349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 23359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 23369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 23379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 23399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 23409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 23419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 23429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name)); 236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionDeclaration (const char *name, void *function_clang_type, int storage, bool is_inline) 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (&ast_context->Idents.get(name)), 238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionType (void *result_type, void **args, unsigned num_args, bool isVariadic, unsigned TypeQuals) 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type), 241553d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner isVariadic, 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeQuals, 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasExceptionSpec 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasAnyExceptionSpec, 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // NumExs 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // const QualType *ExArray 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn); 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 242784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateParmeterDeclaration (const char *name, void *return_type, int storage) 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ParmVarDecl::Create(*ast_context, 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(return_type), 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateArrayType (void *element_type, size_t element_count, uint32_t bit_stride) 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::StartTagDeclarationDefinition (void *clang_type) 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 24771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CompleteTagDeclarationDefinition (void *clang_type) 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 25011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->completeDefinition(); 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name) 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumDecl *enum_decl = EnumDecl::Create(*ast_context, 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL); 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr(); 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *enum_clang_type, 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *enumerator_clang_type, 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl::Create(*ast_context, 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl(), 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(enumerator_clang_type), 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint); 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreatePointerType (void *clang_type) 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 25977b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 25987b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 25997b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 26007b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton switch (qual_type->getTypeClass()) 26017b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 26027b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 26037b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 26047b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton // TODO: find out if I need to make a pointer or objc pointer for "clang::Type::ObjCObjectPointer" types 26057b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton //case clang::Type::ObjCObjectPointer: 26067b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 26077b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 26087b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton // TODO: can we detect if this type is a block type? 26097b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton// case clang::Type::BlockType: 26107b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton// return getASTContext()->getBlockPointerType(qual_type).getAsOpaquePtr(); 26117b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 26127b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 26137b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getPointerType(qual_type).getAsOpaquePtr(); 26147b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 26157b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateLValueReferenceType (void *clang_type) 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateRValueReferenceType (void *clang_type) 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2635fa97069b86f30aa44bb23a1de506ae220359b4faGreg Claytonvoid * 263684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateMemberPointerType (void *clang_pointee_type, void *clang_class_type) 2637fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 2638fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 2639fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 2640fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 2641fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 2642fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 2643fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(ast_context->VoidPtrTy); 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerOrReferenceType (void *clang_type, void **target_type) 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeBitSize (clang::ASTContext *ast_context, void *clang_type) 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(QualType::getFromOpaquePtr(clang_type)); 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeBitAlign (clang::ASTContext *ast_context, void *clang_type) 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeAlign(QualType::getFromOpaquePtr(clang_type)); 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 270984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::IsIntegerType (void *clang_type, bool &is_signed) 271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerType (void *clang_type, void **target_type) 273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 27401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 27441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 27481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 27521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type); 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsFloatingPointType (void *clang_type, uint32_t &count, bool &is_complex) 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsCStringType (void *clang_type, uint32_t &length) 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr()); 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType element_qual_type = array->getElementType(); 28131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type && canonical_type->isCharType()) 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We know the size of the array and it could be a C string 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // since it is an array of characters 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = array->getSize().getLimitedValue(); 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 28271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr(); 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pointee_type_ptr) 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = 0; // No length info, read until a NULL terminator is received 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type_ptr) 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return canonical_type_ptr->isCharType(); 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type_ptr->isCharType(); 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length); 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 28441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 28471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr(); 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pointee_type_ptr) 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = 0; // No length info, read until a NULL terminator is received 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type_ptr) 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return canonical_type_ptr->isCharType(); 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type_ptr->isCharType(); 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 286584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::IsArrayType (void *clang_type, void **member_type, uint64_t *size) 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (qual_type->getTypeClass()) 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 28801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 28861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 28911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateTypedefType (const char *name, void *clang_type, DeclContext *decl_ctx) 290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypedefDecl *decl = TypedefDecl::Create(*ast_context, 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->CreateTypeSourceInfo(qual_type)); 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypedefType (decl).getAsOpaquePtr(); 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeName (void *opaque_qual_type) 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_qual_type)); 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::TypedefDecl *typedef_decl = typedef_type->getDecl(); 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, void *clang_type, const char *s, uint8_t *dst, size_t dst_size) 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref); 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t bit_size = ast_context->getTypeSize (qual_type); 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3029