ClangASTContext.cpp revision ad60bf486dee699dd524225b63271ddc5b6329b9
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 401462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 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 411462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 412462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (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 471462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 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 660462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 661462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context) 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 663a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return ast_context->VoidTy.getAsOpaquePtr(); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 666462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 667960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 668960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 669960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return getASTContext()->getObjCIdType().getAsOpaquePtr(); 670960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 671960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 672462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 673960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 674960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 675960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return getASTContext()->getObjCClassType().getAsOpaquePtr(); 676960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 677960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 678462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 679960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return getASTContext()->getObjCSelType().getAsOpaquePtr(); 682960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 684462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 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 695462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 701462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 702462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (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 712462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 713462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CopyType (ASTContext *dest_context, 714462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *source_context, 715462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t 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 727462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context, 728462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 729462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t 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 737462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 738462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t 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 749462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 750462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t 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 761462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 762462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t 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 775462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 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 { 787306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 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 806dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 807dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 808dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 809dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 810dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 811dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 812dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (::strstr(name, "operator ") != name) 813dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 814dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 815dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton const char *post_op_name = name + 9; 816dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 817dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 818dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 819dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 820dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 821dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 822dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 823dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 824dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 825dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 826dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 827dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 828dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 829dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 830dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 831dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 832dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 833dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 834dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 835dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 836dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 837dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 838dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 839dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 840dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 841dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 842dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 843dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 844dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 845dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 846dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 847dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 848dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 849dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 850dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 851dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 852dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 853dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 854dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 855dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 856dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 857dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 858dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 859dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 860dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 861dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 862dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 863dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 864dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 865dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 866dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 867dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 868dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 869dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 870dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 871dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 872dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 873dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 874dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 875dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 876dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 877dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 878dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 879dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 886dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 887dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 888dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 889dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 890dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 891dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 892dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 893dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 894dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 895dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 896dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 897dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 898dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 899dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 900dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 901dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 902dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 903dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 904dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 905dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 913dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 914dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 915dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 916dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 918dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 919dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 927dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 928dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 997412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 998795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 999795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1000462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1001462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1002412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1003462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1004412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 10051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 10061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 100730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 100830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1009412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1010795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 10113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1012974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1013795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1014795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(ast_context); 1015795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1016795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 1017795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1018795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1019795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 10211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 10221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *clang_type(record_qual_type.getTypePtr()); 1023795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type == NULL) 1025412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1026795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordType *record_clang_type(dyn_cast<RecordType>(clang_type)); 1028795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_clang_type == NULL) 1030412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1031795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordDecl *record_decl = record_clang_type->getDecl(); 1033795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_decl == NULL) 1035412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1036795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1037795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 1038795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1040412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1041795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 10431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 104430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 10453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 104630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 104790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 104890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 104990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 10505325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 105190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 10525325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 105390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 105490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 10555325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 105630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 105790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 105890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 105990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 106090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 106190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 106290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 106390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 106490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast_context, 106590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 10665325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 106790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 106890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 106990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 107090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 107190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton else if (decl_name == record_decl->getDeclName()) 107230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 107330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast_context, 107430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 10755325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 107630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 107730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 107830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 107930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 108030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 108130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 108230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 108390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1084dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1085dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1086dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 108790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1088dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1089dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1090dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 109190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1092dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 109390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 109490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1095dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1096dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1097dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline); 1098dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1099dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1100dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1101dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1102dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast_context, 1103dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 11045325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1105dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1106dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1107dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1108dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_explicit); 1109dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 111090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1111dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1112dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 111390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 111490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 111590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1116dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 111790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 111890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 111990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 112090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 112190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline); 112290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 112330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1124dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1125462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 112647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 11271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 11281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 112947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 11303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 11313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 11333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 11353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 11363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 11373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 11381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params[param_index] = ParmVarDecl::Create (*ast_context, 11391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 11401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 11411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 11421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 11431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 11441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 11451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 11461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 11473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 11503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 1152795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1153412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1154795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1155795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1156795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 115784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 115884f8075072eef306234f8109573067647735c111Greg Clayton( 1159462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1160462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 116184f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1162462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 116384f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 116484f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 116584f8075072eef306234f8109573067647735c111Greg Clayton) 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 119047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119284f8075072eef306234f8109573067647735c111Greg Clayton FieldDecl *field = FieldDecl::Create (*ast_context, 119384f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 119484f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 119584f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 119684f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 119784f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 119884f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 119984f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120184f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 12099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 12119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 12129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 121460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan ClangASTContext::AddObjCClassIVar (ast_context, 121560a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 12169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 12179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 12189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 12199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 12201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 12219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context == NULL || field == NULL) 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context)) 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1287462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type) 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 12921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = qual_type.getTypePtr(); 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl) 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx; 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++field_idx) 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no accessibility was assigned, assign the correct one 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field->setAccess ((AccessSpecifier)default_accessibility); 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1320462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 13236e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 13246e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 13256e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 13266e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 13276e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type))); 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1331e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1332e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1333e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1334e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1335e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1336e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1337e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1338e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1339e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1340e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1342462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl()); 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setBases(base_classes, num_base_classes); 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 136384f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 136484f8075072eef306234f8109573067647735c111Greg Clayton 1365462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 136684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 136784f8075072eef306234f8109573067647735c111Greg Clayton( 136884f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 136984f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 137084f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 137184f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 137284f8075072eef306234f8109573067647735c111Greg Clayton) 137384f8075072eef306234f8109573067647735c111Greg Clayton{ 137484f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 137584f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 137684f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 137784f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 137884f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx = ast_context->getTranslationUnitDecl(); 137984f8075072eef306234f8109573067647735c111Greg Clayton 138084f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 138184f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 138284f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 138384f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 138484f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 138584f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context, 138684f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 138784f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 138884f8075072eef306234f8109573067647735c111Greg Clayton &ast_context->Idents.get(name), 138984f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 139084f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 139184f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 13929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 13939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr(); 139484f8075072eef306234f8109573067647735c111Greg Clayton} 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139684f8075072eef306234f8109573067647735c111Greg Claytonbool 1397462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 139884f8075072eef306234f8109573067647735c111Greg Clayton{ 139984f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 140084f8075072eef306234f8109573067647735c111Greg Clayton { 140184f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 140284f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 140384f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 140484f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 140584f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 140684f8075072eef306234f8109573067647735c111Greg Clayton { 140784f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 140884f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 140984f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 141084f8075072eef306234f8109573067647735c111Greg Clayton { 141184f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 141284f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 141384f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 141484f8075072eef306234f8109573067647735c111Greg Clayton { 141584f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 141684f8075072eef306234f8109573067647735c111Greg Clayton return true; 141784f8075072eef306234f8109573067647735c111Greg Clayton } 141884f8075072eef306234f8109573067647735c111Greg Clayton } 141984f8075072eef306234f8109573067647735c111Greg Clayton } 142084f8075072eef306234f8109573067647735c111Greg Clayton } 142184f8075072eef306234f8109573067647735c111Greg Clayton return false; 142284f8075072eef306234f8109573067647735c111Greg Clayton} 142384f8075072eef306234f8109573067647735c111Greg Clayton 142484f8075072eef306234f8109573067647735c111Greg Clayton 142584f8075072eef306234f8109573067647735c111Greg Claytonbool 142684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 142784f8075072eef306234f8109573067647735c111Greg Clayton( 1428462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1429462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 143084f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1431462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 143284f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 143384f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 14341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 143584f8075072eef306234f8109573067647735c111Greg Clayton) 143684f8075072eef306234f8109573067647735c111Greg Clayton{ 143784f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 143884f8075072eef306234f8109573067647735c111Greg Clayton return false; 143984f8075072eef306234f8109573067647735c111Greg Clayton 144060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 144184f8075072eef306234f8109573067647735c111Greg Clayton 144284f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 144384f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 144484f8075072eef306234f8109573067647735c111Greg Clayton 144584f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 144684f8075072eef306234f8109573067647735c111Greg Clayton 144784f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 144884f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 144984f8075072eef306234f8109573067647735c111Greg Clayton { 145084f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 145184f8075072eef306234f8109573067647735c111Greg Clayton 145284f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 145384f8075072eef306234f8109573067647735c111Greg Clayton { 145484f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 145584f8075072eef306234f8109573067647735c111Greg Clayton 145684f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 145784f8075072eef306234f8109573067647735c111Greg Clayton { 145884f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 145984f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 146084f8075072eef306234f8109573067647735c111Greg Clayton { 146184f8075072eef306234f8109573067647735c111Greg Clayton APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 146247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 146384f8075072eef306234f8109573067647735c111Greg Clayton } 146484f8075072eef306234f8109573067647735c111Greg Clayton 14659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context, 14669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 14679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 14689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 14699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 14709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 14719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 14729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 14731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 14749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 14769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 14789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 14799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 148084f8075072eef306234f8109573067647735c111Greg Clayton } 148184f8075072eef306234f8109573067647735c111Greg Clayton } 148284f8075072eef306234f8109573067647735c111Greg Clayton } 148384f8075072eef306234f8109573067647735c111Greg Clayton return false; 148484f8075072eef306234f8109573067647735c111Greg Clayton} 148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14879488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1488462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 14899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 14909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 14939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 14949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 14959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 14969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 14989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 14999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 15019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 15029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15039488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 15049488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 15059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 15069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 15079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 15099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 15109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 15129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 15139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 15149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 15159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 15179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 15181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1519462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 15201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 15211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1522462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1523462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 15241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1525462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 15261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 15271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 15281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 15291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 15301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton IdentifierTable *identifier_table = &ast_context->Idents; 15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (ast_context != NULL); 15351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 15361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 15381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 15401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 15411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 15441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 15461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 15491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 15511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 15541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 15551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 15581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 15591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 15611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1562ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 15631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1564ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1565ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1566ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1567ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 15681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1569ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 15701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1571ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 1572ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton if (start[len] == ':') 1573ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1574ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 1575ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len += 1; 1576ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1577ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("@selector[%zu] = '%.*s'\n", selector_idents.size(), (int)len, start); 15781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 15791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 15801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 15831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 15841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1585ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 15861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 15871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 15891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 15911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *method_type(method_qual_type.getTypePtr()); 15921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 15941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 15971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 15991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 16031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 16041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 16051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 16061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 16081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context, 16101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 16111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 16121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 16131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 16141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 16151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 16181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 16211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 16221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 16251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 16291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 16321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 16331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params.push_back (ParmVarDecl::Create (*ast_context, 16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 16361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 16371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args); 16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1658462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type->isAggregateType ()) 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 166903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 16721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 16731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 16741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 16751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 16761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 16779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 16789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 1692462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes) 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type == NULL) 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 16999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 17009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1702960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1703960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 1704960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1705960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: // Child is Class 1706960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 1707960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCSel: // child is const char * 1708960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1709960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1710960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1711960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1712960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1713960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1714960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 17151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 17579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 17589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 17599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 17609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 17619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 17629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 17639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 17649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 17669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 17679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 17699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 17709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 17719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 17729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 17739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 17749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 17759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 17769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 17779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 17789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 17799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 17819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 17829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 17839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 17849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 17859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 1787960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1788960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 1789960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 1790960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1791960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 1792960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 1793960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 1794960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1795960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 1796960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 1797960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1798960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 17999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 18089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 18099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If this type points to a simple type, then it has 1 child 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = 1; 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes); 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 182624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1829462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 1833462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 183624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 183724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 183824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 183924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 184024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 184124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_offset 184224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 184324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1860462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 1865462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_offset 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes)) 188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 188503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 188603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1888960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1889960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 1890960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1891960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 1892960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 1893960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 1894960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1895960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCSel: 1896960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1897960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType char_type(ast_context->CharTy); 1898960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton char_type.addConst(); 1899960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->getPointerType(char_type).getAsOpaquePtr(); 1900960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1901960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1902960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1903960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1904960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1905960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1907960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 19091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); 191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 192924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getVBaseClassOffset(base_class_decl); 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getBaseClassOffset(base_class_decl); 194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType()); 195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType()); 198054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size)) 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 199124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 199224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 19979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 19989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 20009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 20019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 20029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 20049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 20059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 20079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl); 20109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 20119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 20129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 20149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2015960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 20169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 20189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl)); 20209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 20239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 20259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2027960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 20289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 20309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 20339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 20369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 20379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2038960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2039960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 20409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 20429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 20449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 20469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 20489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 20499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 20509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 20529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 20549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 20569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 20589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 2060960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 20619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 20629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 20649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 20669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 20719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 20729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 20749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2075960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2076960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2077960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2078960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2079960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2080960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return GetChildClangTypeAtIndex (ast_context, 2081960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2082960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2083960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2084960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2085960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2086960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2087960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2088960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2089960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2090960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_offset); 2091960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2092960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2093960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2094960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2095960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2096960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2097960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2098960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2099960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2100960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2101960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2102960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2103960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2104960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2105960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2106960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2107960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2108960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2109960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 21109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 21129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char element_name[32]; 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(element_name); 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(field_type_info.first % 8 == 0); 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = idx * child_byte_size; 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return array->getElementType().getAsOpaquePtr(); 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset); 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2192f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false; 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 233424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 233524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 233824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 233924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2373462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 238203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 238303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name)); 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 24739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 24749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 24759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 24769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 24779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 24789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 24799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 24809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 24819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 24829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 24839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 24849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 24859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 24869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 24879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2488823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 24899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 24909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 24919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 24929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 24939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 24949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 24959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 24969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 24979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 24989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 24999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 25009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 25049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 25069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 25079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 25089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 25099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (GetIndexOfChildMemberWithName (ast_context, 25119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 25129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 25139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 25149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 25159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 25179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 25189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 25199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 25229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 25239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 25249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 25259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 25309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 25329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildMemberWithName (ast_context, 25349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 25359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 25369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 25379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 25389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 25409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 25781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2651462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 26599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 266003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 26619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 266203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 27239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 27259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 27279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 27299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 27309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 27319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 27339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 27379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 27399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 27409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 27479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildWithName (ast_context, 27499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 27509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 27519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 27529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 27911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2855462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 28601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 2882462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 288803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 288903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 28929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 28939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 28949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 28959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 28969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 28979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 28989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 28999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 29009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 29019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 29029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 29039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 29049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 29059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 29069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 29079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 29089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 29099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 29109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 29119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 29139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 29149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 29159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 29169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name)); 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 2943462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (&ast_context->Idents.get(name)), 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2978462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 2979462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context, 2980462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 2981462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 29822ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 29832ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 29842ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type), 299353d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 29952ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan is_variadic, 29962ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan type_quals, 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasExceptionSpec 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasAnyExceptionSpec, 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // NumExs 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // const QualType *ExArray 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn); 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3005462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ParmVarDecl::Create(*ast_context, 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 30132ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3030462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3031462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3050462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 30551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3074462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 307955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 308055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 308155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 308255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 308455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 308555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 308655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 308755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 308855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 308955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 309055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 309155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 309255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 309355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 309455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 309555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 309855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 309955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 310055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 310155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 310255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), enum_decl->getIntegerType(), NumPositiveBits, NumNegativeBits); 310355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3113462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3114462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name, clang_type_t integer_qual_type) 311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumDecl *enum_decl = EnumDecl::Create(*ast_context, 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL); 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3127e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3128e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3129e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr(); 3131e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3135462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3136462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3137462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3138462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3139462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3140462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 3141462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3142462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3143462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3144462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3145462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3146462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3147462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3148462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3149462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3150462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3151462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3152462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3156462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3157462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl::Create(*ast_context, 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl(), 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(enumerator_clang_type), 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint); 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3206462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3207462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 32107b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 32117b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 32127b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 321303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 321403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 32157b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 32167b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 32177b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 32187b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 32197b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 32207b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 32217b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getPointerType(qual_type).getAsOpaquePtr(); 32227b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 32237b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3227462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3228462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateLValueReferenceType (clang_type_t clang_type) 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3235462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3236462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateRValueReferenceType (clang_type_t clang_type) 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3243462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3244462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3245fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3246fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3247fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3248fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3249fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3250fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3251fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(ast_context->VoidPtrTy); 325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3260462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 326603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 326703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3302462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3322462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 332703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 332803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type); 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3356462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3395462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 33961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 33971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 33981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 33991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 34001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 34011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 34021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 34031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 34041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 34051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 34061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3407462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 34081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 34091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 34101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 34111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 34121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 34131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 34141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 34151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 34161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 34171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 34181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 34191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3422462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 342703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 342803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr()); 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType element_qual_type = array->getElementType(); 34341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type && canonical_type->isCharType()) 343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We know the size of the array and it could be a C string 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // since it is an array of characters 343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = array->getSize().getLimitedValue(); 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 34481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr(); 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pointee_type_ptr) 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); 345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = 0; // No length info, read until a NULL terminator is received 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type_ptr) 345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return canonical_type_ptr->isCharType(); 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type_ptr->isCharType(); 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length); 346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 34651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 346724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 34681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr(); 346924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pointee_type_ptr) 347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr(); 347224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = 0; // No length info, read until a NULL terminator is received 347324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (canonical_type_ptr) 347424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return canonical_type_ptr->isCharType(); 347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type_ptr->isCharType(); 347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3486462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 348703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 348803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 348903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 349003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 349103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 349203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 349303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 349403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 349503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 349603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 349703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 349803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 349903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 350003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 350103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 350203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 350303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 350403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 350503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 350603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 350703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 350803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 350903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 351003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 351103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 351203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 351303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 351403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 351503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 351603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 351703e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 3518462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 352603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 35451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3558462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3559462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypedefDecl *decl = TypedefDecl::Create(*ast_context, 357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->CreateTypeSourceInfo(qual_type)); 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypedefType (decl).getAsOpaquePtr(); 357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 3584462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3588462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3590462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3593462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefDecl *typedef_decl = typedef_type->getDecl(); 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 3611462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str) 361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 3646462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref); 366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t bit_size = ast_context->getTypeSize (qual_type); 366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3683a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3684a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 3685462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 3686a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 3687a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 3688a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3689a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3690a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3691a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 3692a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 3693