ClangASTContext.cpp revision 974fddb5c78e9a754f0894c99a70ed777a8548c3
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 37585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb; 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4284f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 43585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 4484f8075072eef306234f8109573067647735c111Greg Clayton{ 4584f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 4684f8075072eef306234f8109573067647735c111Greg Clayton { 47585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 48585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 49585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 50585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 51585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 5284f8075072eef306234f8109573067647735c111Greg Clayton } 5384f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 5484f8075072eef306234f8109573067647735c111Greg Clayton} 5584f8075072eef306234f8109573067647735c111Greg Clayton 5684f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 57585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 5884f8075072eef306234f8109573067647735c111Greg Clayton{ 5984f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 6084f8075072eef306234f8109573067647735c111Greg Clayton { 61585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 62585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 63585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 65585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 66585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 6784f8075072eef306234f8109573067647735c111Greg Clayton } 6884f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 6984f8075072eef306234f8109573067647735c111Greg Clayton} 7084f8075072eef306234f8109573067647735c111Greg Clayton 7184f8075072eef306234f8109573067647735c111Greg Clayton 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 76e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 84e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 86e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 87e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 88e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 89e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 98e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 99e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(0 && "Invalid input kind!"); 101e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 104e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 105e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 106e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 108e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 112e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 113e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 114e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.setVisibilityMode(LangOptions::Default); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 236e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) : 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap(), 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap() 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_ast_context_ap.get() == NULL) 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset( 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new ASTContext( 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getLanguageOptions(), 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSourceManager(), 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getTargetInfo(), 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getIdentifierTable(), 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSelectorTable(), 3106e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton *getBuiltinContext(), 3116e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton 0)); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ast_context_ap.get(); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 338e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 339e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 3561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic())); 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(new Diagnostic()); 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type) 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 402585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 412585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast_context, Encoding encoding, uint32_t bit_size) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ast_context) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 419585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 424585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 439585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 454585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 463585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy)) 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->BoolTy.getAsOpaquePtr(); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy)) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatComplexTy.getAsOpaquePtr(); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy)) 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleComplexTy.getAsOpaquePtr(); 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy)) 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleComplexTy.getAsOpaquePtr(); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "int") || 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed int")) 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "long int") || 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "long long int") || 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed long long")) 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "short") || 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short int") || 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed short") || 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short signed int")) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "char") || 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed char")) 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "wchar_t")) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy)) 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->WCharTy.getAsOpaquePtr(); 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned int")) 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned int") || 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "long unsigned int") || 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "unsigned long long")) 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned short") || 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short unsigned int")) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned char")) 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 661a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean CallananClangASTContext::GetBuiltInType_void(clang::ASTContext *ast_context) 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 663a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return ast_context->VoidTy.getAsOpaquePtr(); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 667960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 668960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 669960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return getASTContext()->getObjCIdType().getAsOpaquePtr(); 670960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 671960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 672960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonvoid * 673960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 674960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 675960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return getASTContext()->getObjCClassType().getAsOpaquePtr(); 676960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 677960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 678960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonvoid * 679960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return getASTContext()->getObjCSelType().getAsOpaquePtr(); 682960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 684960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonvoid * 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (clang::ASTContext *ast_context, bool is_const) 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType void_ptr_type(ast_context->VoidPtrTy); 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CopyType(clang::ASTContext *dest_context, 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *source_context, 71584f8075072eef306234f8109573067647735c111Greg Clayton void *clang_type) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Diagnostic diagnostics; 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileManager file_manager; 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTImporter importer(diagnostics, 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *dest_context, file_manager, 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *source_context, file_manager); 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type)); 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ret.getAsOpaquePtr(); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7268d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 7278d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean CallananClangASTContext::AreTypesSame(clang::ASTContext *ast_context, 7285510dddc33260a991284ef81ca343594f23262e8Sean Callanan void *type1, 7295510dddc33260a991284ef81ca343594f23262e8Sean Callanan void *type2) 7305510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 7315510dddc33260a991284ef81ca343594f23262e8Sean Callanan return ast_context->hasSameType(QualType::getFromOpaquePtr(type1), 7325510dddc33260a991284ef81ca343594f23262e8Sean Callanan QualType::getFromOpaquePtr(type2)); 7335510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 7345510dddc33260a991284ef81ca343594f23262e8Sean Callanan 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddConstModifier (void *clang_type) 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddRestrictModifier (void *clang_type) 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddVolatileModifier (void *clang_type) 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 776585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 785585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 7869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 7879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isForwardDecl = false; 7889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 7899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 7909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 7919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context, 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL); 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(decl).getAsOpaquePtr(); 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 806412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 807795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 808795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 809412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton clang::ASTContext *ast_context, 810412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton void *record_opaque_type, 811412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 812412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton void *method_opaque_type, 813412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 8141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 8151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 8161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_inline 817412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 818795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 8193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 820974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 821795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 822795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(ast_context); 823795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 824795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 825795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 826795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 827795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 8291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 8301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *clang_type(record_qual_type.getTypePtr()); 831795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type == NULL) 833412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 834795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordType *record_clang_type(dyn_cast<RecordType>(clang_type)); 836795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_clang_type == NULL) 838412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 839795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordDecl *record_decl = record_clang_type->getDecl(); 841795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_decl == NULL) 843412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 844795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 845795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 846795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 848412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 849795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 8511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 8521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton CXXMethodDecl *cxx_method_decl = CXXMethodDecl::Create (*ast_context, 8531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl, 8541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton DeclarationNameInfo (DeclarationName (&identifier_table->get(name)), SourceLocation()), 8551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_qual_type, 8561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo * 8571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 8581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 8591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_inline); 8603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 861795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 8621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 86347a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 8641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 8651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 86647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 8673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 8683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::Type *method_type(method_qual_type.getTypePtr()); 8693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 871412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 8723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 8743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 876412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 8773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 8793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 8813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 8833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 8843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 8853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 8861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params[param_index] = ParmVarDecl::Create (*ast_context, 8871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 8881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 8891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 8901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 8911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 8921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 8931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 8941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 8953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 8963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 8983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 8991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 900795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 901412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 902795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 903795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 904795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 90584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 90684f8075072eef306234f8109573067647735c111Greg Clayton( 90760a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan clang::ASTContext *ast_context, 90884f8075072eef306234f8109573067647735c111Greg Clayton void *record_clang_type, 90984f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 91084f8075072eef306234f8109573067647735c111Greg Clayton void *field_type, 91184f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 91284f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 91384f8075072eef306234f8109573067647735c111Greg Clayton) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91860a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 936a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton { 937a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // NOTE: we currently have some fixes that should be placed 938a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // into clang that will automatically set if a record is empty 939a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // when each field is added (during the addDecl() method call 940a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // below) so this code should be able to come out when those 941a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // changes make it into llvm/clang, then we can remove this 942a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // code... 943a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // Currently SEMA is using the accessors manually to set 944a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // whether a class is empty, is POD, is aggregate, and more. 945a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // This code will be moved into CXXRecordDecl so everyone 946a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // can benefit. 947a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // This will currently work for everything except zero sized 948a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // bitfields which we currently aren't detecting anyway from the 949a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // DWARF so it should be ok for now. 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setEmpty (false); 951a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton } 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 95747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95984f8075072eef306234f8109573067647735c111Greg Clayton FieldDecl *field = FieldDecl::Create (*ast_context, 96084f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 96184f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 96284f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 96384f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 96484f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 96584f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 96684f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96884f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 973a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton 974a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // NOTE: we currently have some fixes that should be placed 975a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // into clang that will automatically set if a record is POD 976a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // when each field is added (during the addDecl() method call 977a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // above) so this code should be able to come out when those 978a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // changes make it into llvm/clang, then we can remove this 979a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // code... 980a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // Currently SEMA is using the accessors manually to set 981a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // whether a class is empty, is POD, is aggregate, and more. 982a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // This code will be moved into CXXRecordDecl so everyone 983a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // can benefit. 984a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton 98522d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton if (cxx_record_decl->isPOD()) 98622d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton { 98722d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton if (!field->getType()->isPODType()) 98822d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton cxx_record_decl->setPOD (false); 98922d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton return true; 99022d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton } 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 9949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 9959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 9969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 9979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 9981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 99960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan ClangASTContext::AddObjCClassIVar (ast_context, 100060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 10019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 10029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 10039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 10049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 10051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 10069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 10079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context == NULL || field == NULL) 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context)) 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetDefaultAccessForRecordFields (void *clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type) 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 10771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = qual_type.getTypePtr(); 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl) 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx; 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++field_idx) 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no accessibility was assigned, assign the correct one 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field->setAccess ((AccessSpecifier)default_accessibility); 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 110584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateBaseClassSpecifier (void *base_class_type, AccessType access, bool is_virtual, bool base_of_class) 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 11086e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 11096e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 11106e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 11116e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 11126e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type))); 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1116e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1117e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1118e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1119e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1120e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1121e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1122e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1123e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1124e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1125e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetBaseClassesForClassType (void *class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl()); 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setBases(base_classes, num_base_classes); 1141bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton 1142a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // NOTE: we currently have some fixes that should be placed 1143a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // into clang that will automatically set these things when 1144a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // they are added (during the setBases() method call above) 1145a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // so this code should be able to come out when those changes 1146a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // make it into llvm/clang, then we can remove this code... 1147a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // Currently SEMA is using the accessors manually to set 1148a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // whether a class is empty, is POD, is aggregate, and more. 1149a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // This code will be moved into CXXRecordDecl so everyone 1150a4e27afe72b9b918cea837e5b8b293e8edfe1555Greg Clayton // can benefit. 115122d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton if (cxx_record_decl->isEmpty() || cxx_record_decl->isPOD()) 1152bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton { 1153bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton // set empty to false if any bases are virtual, or not empty. 1154bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton 1155bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 1156bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 1157bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton base_class != base_class_end; 1158bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton ++base_class) 1159bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton { 1160bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton if (base_class->isVirtual()) 1161bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton { 1162bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton cxx_record_decl->setEmpty (false); 116322d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton cxx_record_decl->setPOD (false); 1164bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton break; 1165bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton } 1166bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton else 1167bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton { 116822d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton QualType base_type (base_class->getType()); 116922d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton 117022d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton if (!base_type->isPODType()) 117122d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton cxx_record_decl->setPOD (false); 117222d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton 117322d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_type->getAs<RecordType>()->getDecl()); 117422d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton if (!base_class_decl->isEmpty()) 117522d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton { 1176bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton cxx_record_decl->setEmpty (false); 1177bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton break; 117822d5fe3efb43c7ad76e12cfd764848f7103f6a8cGreg Clayton } 1179bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton } 1180bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton } 1181bba60fbd151ff3c36719c35e7bcb0fdfb0dd9ebcGreg Clayton } 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 118984f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 119084f8075072eef306234f8109573067647735c111Greg Clayton 119184f8075072eef306234f8109573067647735c111Greg Claytonvoid * 119284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 119384f8075072eef306234f8109573067647735c111Greg Clayton( 119484f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 119584f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 119684f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 119784f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 119884f8075072eef306234f8109573067647735c111Greg Clayton) 119984f8075072eef306234f8109573067647735c111Greg Clayton{ 120084f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 120184f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 120284f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 120384f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 120484f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx = ast_context->getTranslationUnitDecl(); 120584f8075072eef306234f8109573067647735c111Greg Clayton 120684f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 120784f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 120884f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 120984f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 121084f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 121184f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context, 121284f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 121384f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 121484f8075072eef306234f8109573067647735c111Greg Clayton &ast_context->Idents.get(name), 121584f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 121684f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 121784f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 12189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 12199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr(); 122084f8075072eef306234f8109573067647735c111Greg Clayton} 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122284f8075072eef306234f8109573067647735c111Greg Claytonbool 122384f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::SetObjCSuperClass (void *class_opaque_type, void *super_opaque_type) 122484f8075072eef306234f8109573067647735c111Greg Clayton{ 122584f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 122684f8075072eef306234f8109573067647735c111Greg Clayton { 122784f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 122884f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 122984f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 123084f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 123184f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 123284f8075072eef306234f8109573067647735c111Greg Clayton { 123384f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 123484f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 123584f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 123684f8075072eef306234f8109573067647735c111Greg Clayton { 123784f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 123884f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 123984f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 124084f8075072eef306234f8109573067647735c111Greg Clayton { 124184f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 124284f8075072eef306234f8109573067647735c111Greg Clayton return true; 124384f8075072eef306234f8109573067647735c111Greg Clayton } 124484f8075072eef306234f8109573067647735c111Greg Clayton } 124584f8075072eef306234f8109573067647735c111Greg Clayton } 124684f8075072eef306234f8109573067647735c111Greg Clayton } 124784f8075072eef306234f8109573067647735c111Greg Clayton return false; 124884f8075072eef306234f8109573067647735c111Greg Clayton} 124984f8075072eef306234f8109573067647735c111Greg Clayton 125084f8075072eef306234f8109573067647735c111Greg Clayton 125184f8075072eef306234f8109573067647735c111Greg Claytonbool 125284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 125384f8075072eef306234f8109573067647735c111Greg Clayton( 125460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan clang::ASTContext *ast_context, 125584f8075072eef306234f8109573067647735c111Greg Clayton void *class_opaque_type, 125684f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 125784f8075072eef306234f8109573067647735c111Greg Clayton void *ivar_opaque_type, 125884f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 125984f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 12601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 126184f8075072eef306234f8109573067647735c111Greg Clayton) 126284f8075072eef306234f8109573067647735c111Greg Clayton{ 126384f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 126484f8075072eef306234f8109573067647735c111Greg Clayton return false; 126584f8075072eef306234f8109573067647735c111Greg Clayton 126660a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 126784f8075072eef306234f8109573067647735c111Greg Clayton 126884f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 126984f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 127084f8075072eef306234f8109573067647735c111Greg Clayton 127184f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 127284f8075072eef306234f8109573067647735c111Greg Clayton 127384f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 127484f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 127584f8075072eef306234f8109573067647735c111Greg Clayton { 127684f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 127784f8075072eef306234f8109573067647735c111Greg Clayton 127884f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 127984f8075072eef306234f8109573067647735c111Greg Clayton { 128084f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 128184f8075072eef306234f8109573067647735c111Greg Clayton 128284f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 128384f8075072eef306234f8109573067647735c111Greg Clayton { 128484f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 128584f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 128684f8075072eef306234f8109573067647735c111Greg Clayton { 128784f8075072eef306234f8109573067647735c111Greg Clayton APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 128847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 128984f8075072eef306234f8109573067647735c111Greg Clayton } 129084f8075072eef306234f8109573067647735c111Greg Clayton 12919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context, 12929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 12939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 12949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 12959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 12969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 12979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 12989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 12991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 13009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 13029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 13039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 13049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 13059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 130684f8075072eef306234f8109573067647735c111Greg Clayton } 130784f8075072eef306234f8109573067647735c111Greg Clayton } 130884f8075072eef306234f8109573067647735c111Greg Clayton } 130984f8075072eef306234f8109573067647735c111Greg Clayton return false; 131084f8075072eef306234f8109573067647735c111Greg Clayton} 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13139488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 13149488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCTypeHasIVars (void *class_opaque_type, bool check_superclass) 13159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 13169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 13179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 13199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 13209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 13219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 13229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 13249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 13259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 13269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 13279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 13289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13299488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 13309488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 13319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 13329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 13339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 13349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 13359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 13369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 13389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 13399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 13409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 13419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 13429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 13439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 13441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonclang::ObjCMethodDecl * 13461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 13471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 13481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::ASTContext *ast_context, 13491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton void *class_opaque_type, 13501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 13511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton void *method_opaque_type, 13521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 13531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 13541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 13551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 13561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 13571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton IdentifierTable *identifier_table = &ast_context->Idents; 13591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (ast_context != NULL); 13611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 13621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 13641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 13661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 13671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 13681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 13701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 13721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 13731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 13751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 13771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 13781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 13801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 13811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 13821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 13841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 13851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 13861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 13871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton size_t len; 13891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 13901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (start = selector_start, len = ::strcspn(start, ":]"); 13911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 13921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start += len + 1) 13931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 13941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 13951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 13961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 13981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 13991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 14001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Selector method_selector = ast_context->Selectors.getSelector (selector_idents.size(), 14021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 14031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 14051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 14071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *method_type(method_qual_type.getTypePtr()); 14081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 14101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 14111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 14131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 14151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 14161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 14191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 14201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 14211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 14221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 14241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context, 14261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 14271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 14281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 14291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 14301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 14311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 14321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 14331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 14341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 14351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 14361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 14371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 14381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 14411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 14421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 14441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 14451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 14461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 14481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 14491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params.push_back (ParmVarDecl::Create (*ast_context, 14501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 14511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 14521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 14531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 14541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 14551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 14561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 14571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 14581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 14591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args); 14611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 14629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 14641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 14671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 14681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 14709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsAggregateType (void *clang_type) 147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type->isAggregateType ()) 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 148403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 148503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 14881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 14891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 14901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 14911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 14921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 14939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 14949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_classes) 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type == NULL) 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 15159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 15169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1518960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1519960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 1520960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1521960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: // Child is Class 1522960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 1523960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCSel: // child is const char * 1524960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1525960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1526960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1527960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1528960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1529960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1530960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 15311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 15769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 15789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 15809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 15829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 15859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 15869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 15889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 15909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 15919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 15939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 15949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 15979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 16009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 16019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 16029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 1603960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1604960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 1605960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 1606960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1607960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 1608960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 1609960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 1610960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1611960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 1612960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 1613960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1614960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 16159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 16161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 16249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 16259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If this type points to a simple type, then it has 1 child 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = 1; 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes); 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *parent_clang_type, 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_offset 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *parent_clang_type, 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_offset 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes)) 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 170103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 170203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1704960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1705960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 1706960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1707960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 1708960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 1709960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 1710960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1711960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCSel: 1712960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1713960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType char_type(ast_context->CharTy); 1714960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton char_type.addConst(); 1715960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->getPointerType(char_type).getAsOpaquePtr(); 1716960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1717960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1718960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1719960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1720960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1721960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1722960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1723960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1724960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 17251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getVBaseClassOffset(base_class_decl); 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getBaseClassOffset(base_class_decl); 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType()); 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType()); 179654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size)) 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 18139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 18149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 18169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 18179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 18189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 18209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 18219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 18239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl); 18269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 18279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 18289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 18309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1831960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 18329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 18349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl)); 18369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 18399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 18419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 1843960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 18449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 18469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 18499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 18529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 18539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 1854960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1855960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 18569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 18589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 18609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 18629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 18669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 18689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 18709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 18729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 18749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 1876960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 18779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 18789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 18809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 18829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 18889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 18909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1891960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 1892960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 1893960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1894960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 1895960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1896960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return GetChildClangTypeAtIndex (ast_context, 1897960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 1898960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 1899960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 1900960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 1901960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 1902960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 1903960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 1904960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 1905960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 1906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_offset); 1907960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 1909960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1910960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 1911960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 1913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 1914960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1916960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 1917960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 1918960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1919960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 1920960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 1921960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 1922960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 1923960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 1924960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1925960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 19269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char element_name[32]; 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(element_name); 194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(field_type_info.first % 8 == 0); 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = idx * child_byte_size; 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return array->getElementType().getAsOpaquePtr(); 194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2008f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false; 201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *clang_type, 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 219803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 219903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name)); 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 22899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 22909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 22929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 22939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 22949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 22959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 22979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 22989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 23009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 23029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 23039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2304823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 23059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 23079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 23099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 23119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 23129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 23139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 23169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 23259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (GetIndexOfChildMemberWithName (ast_context, 23279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 23289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 23299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 23309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 23319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 23339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 23349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 23359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 23399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 23409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 23419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 23469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 23489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildMemberWithName (ast_context, 23509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 23519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 23529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 23539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 23549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 23569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 23931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 23941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *clang_type, 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 24759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 247603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 24779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 247803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 25239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 25249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 25269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 25279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 25289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 25299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 25319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 25329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 25349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 25369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 25379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 25399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 25419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 25439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 25459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 25469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 25479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 25499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 25539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 25559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 25569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 25619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 25639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildWithName (ast_context, 25659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 25669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 25679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 25689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 25709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 26071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTagTypeKind (void *tag_clang_type, int kind) 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 26761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetDeclContextForType (void *clang_type) 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 270403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 270503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 27239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 27249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 27259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 27269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 27279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 27299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 27309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 27319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 27329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name)); 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateFunctionDeclaration (const char *name, void *function_clang_type, int storage, bool is_inline) 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (&ast_context->Idents.get(name)), 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 27952ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean CallananClangASTContext::CreateFunctionType (clang::ASTContext *ast_context, 27962ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan void *result_type, 27972ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan void **args, 27982ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 27992ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 28002ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type), 280953d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 28112ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan is_variadic, 28122ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan type_quals, 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasExceptionSpec 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasAnyExceptionSpec, 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // NumExs 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // const QualType *ExArray 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn); 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 28212ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean CallananClangASTContext::CreateParameterDeclaration (const char *name, void *param_type, int storage) 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ParmVarDecl::Create(*ast_context, 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 28292ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateArrayType (void *element_type, size_t element_count, uint32_t bit_stride) 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::StartTagDeclarationDefinition (void *clang_type) 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 28711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CompleteTagDeclarationDefinition (void *clang_type) 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 28951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->completeDefinition(); 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 2917e37f23c664f91f38b77029159b29dc62ca19bcb0Greg ClaytonClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name, void *integer_qual_type) 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumDecl *enum_decl = EnumDecl::Create(*ast_context, 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL); 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 2930e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 2931e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 2932e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr(); 2934e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *enum_clang_type, 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *enumerator_clang_type, 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl::Create(*ast_context, 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl(), 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(enumerator_clang_type), 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint); 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreatePointerType (void *clang_type) 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 29957b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 29967b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 29977b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 299803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 299903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 30007b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 30017b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 30027b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 30037b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 30047b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 30057b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 30067b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getPointerType(qual_type).getAsOpaquePtr(); 30077b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 30087b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateLValueReferenceType (void *clang_type) 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateRValueReferenceType (void *clang_type) 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3028fa97069b86f30aa44bb23a1de506ae220359b4faGreg Claytonvoid * 302984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateMemberPointerType (void *clang_pointee_type, void *clang_class_type) 3030fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3031fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3032fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3033fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3034fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3035fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3036fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(ast_context->VoidPtrTy); 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerOrReferenceType (void *clang_type, void **target_type) 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 305103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 305203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 30581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 30621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 30661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 30701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 30741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 30781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 308784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::IsIntegerType (void *clang_type, bool &is_signed) 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsPointerType (void *clang_type, void **target_type) 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 311203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 311303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 31191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 31231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 31271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 31311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type); 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsFloatingPointType (void *clang_type, uint32_t &count, bool &is_complex) 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 31801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::IsCXXClassType (void *clang_type) 31811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 31821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 31831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 31841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 31851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 31861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 31871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 31881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 31891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 31901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 31911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 31921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::IsObjCClassType (void *clang_type) 31931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 31941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 31951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 31961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 31971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 31981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 31991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 32001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 32011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 32021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 32031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 32041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::IsCStringType (void *clang_type, uint32_t &length) 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 321203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 321303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr()); 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType element_qual_type = array->getElementType(); 32191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); 322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type && canonical_type->isCharType()) 322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We know the size of the array and it could be a C string 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // since it is an array of characters 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = array->getSize().getLimitedValue(); 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 32331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr(); 323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pointee_type_ptr) 323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = 0; // No length info, read until a NULL terminator is received 323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type_ptr) 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return canonical_type_ptr->isCharType(); 324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type_ptr->isCharType(); 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length); 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 32501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 32531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr(); 325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pointee_type_ptr) 325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); 325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = 0; // No length info, read until a NULL terminator is received 325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type_ptr) 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return canonical_type_ptr->isCharType(); 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type_ptr->isCharType(); 326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 327103e0f97cfa469792dd69b36f782d33a014225788Greg ClaytonClangASTContext::IsFunctionPointerType (void *clang_type) 327203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 327303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 327403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 327503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 327603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 327703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 327803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 327903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 328003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 328103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 328203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 328303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 328403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 328503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 328603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 328703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 328803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 328903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 329003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 329103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 329203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 329303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 329403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 329503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 329603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 329703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 329803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 329903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 330003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 330103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 330203e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 330384f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::IsArrayType (void *clang_type, void **member_type, uint64_t *size) 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 331103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 33301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid * 334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::CreateTypedefType (const char *name, void *clang_type, DeclContext *decl_ctx) 334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypedefDecl *decl = TypedefDecl::Create(*ast_context, 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->CreateTypeSourceInfo(qual_type)); 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypedefType (decl).getAsOpaquePtr(); 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTypeName (void *opaque_qual_type) 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_qual_type)); 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); 337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::TypedefDecl *typedef_decl = typedef_type->getDecl(); 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, void *clang_type, const char *s, uint8_t *dst, size_t dst_size) 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref); 344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t bit_size = ast_context->getTypeSize (qual_type); 344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 346724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3468a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3469a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 3470a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean CallananClangASTContext::GetTypeQualifiers(void *clang_type) 3471a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 3472a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 3473a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3474a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3475a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3476a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 3477a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 3478