ClangASTContext.cpp revision ad5b61b871bace8dd7b28862662ed7f165d47267
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" 34f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h" 35839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h> 38f05633b35544b5d095feb05680c8728be087e441Eli Friedman 39585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb; 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4484f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 45585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 4684f8075072eef306234f8109573067647735c111Greg Clayton{ 4784f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 4884f8075072eef306234f8109573067647735c111Greg Clayton { 49585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 50585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 51585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 52585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 53585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 5484f8075072eef306234f8109573067647735c111Greg Clayton } 5584f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 5684f8075072eef306234f8109573067647735c111Greg Clayton} 5784f8075072eef306234f8109573067647735c111Greg Clayton 5884f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 59585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 6084f8075072eef306234f8109573067647735c111Greg Clayton{ 6184f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 6284f8075072eef306234f8109573067647735c111Greg Clayton { 63585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 65585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 66585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 67585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 68585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 6984f8075072eef306234f8109573067647735c111Greg Clayton } 7084f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 7184f8075072eef306234f8109573067647735c111Greg Clayton} 7284f8075072eef306234f8109573067647735c111Greg Clayton 7384f8075072eef306234f8109573067647735c111Greg Clayton 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 78e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 86e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 88e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 89e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 90e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 91e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 100e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 101e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(0 && "Invalid input kind!"); 103e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 106e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 108e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 109e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 110e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 113e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 114e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 115e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 116e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.setVisibilityMode(LangOptions::Default); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) : 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap(), 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap() 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_ast_context_ap.get() == NULL) 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset( 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new ASTContext( 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getLanguageOptions(), 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSourceManager(), 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getTargetInfo(), 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getIdentifierTable(), 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSelectorTable(), 3126e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton *getBuiltinContext(), 3136e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton 0)); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ast_context_ap.get(); 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 340e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 341e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 3581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic())); 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(new Diagnostic()); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 404585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size); 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 414462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size) 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ast_context) 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 421585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 426585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 441585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 456585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 465585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 473462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context) 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy)) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->BoolTy.getAsOpaquePtr(); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy)) 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatComplexTy.getAsOpaquePtr(); 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy)) 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleComplexTy.getAsOpaquePtr(); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy)) 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleComplexTy.getAsOpaquePtr(); 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "int") || 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed int")) 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "long int") || 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "long long int") || 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed long long")) 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "short") || 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short int") || 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed short") || 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short signed int")) 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "char") || 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "signed char")) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "wchar_t")) 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy)) 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->WCharTy.getAsOpaquePtr(); 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned int")) 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned int") || 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "long unsigned int") || 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "unsigned long long")) 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned short") || 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner streq(type_name, "short unsigned int")) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "unsigned char")) 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 662462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 663462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context) 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 665a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return ast_context->VoidTy.getAsOpaquePtr(); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 668462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 669960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 670960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 67104325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinIdTy.getAsOpaquePtr(); 672960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 673960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 674462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 675960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 676960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 67704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 678960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 679960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 680462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 682960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 68304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinSelTy.getAsOpaquePtr(); 684960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 685960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 686462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 697462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 703462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 704462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const) 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType void_ptr_type(ast_context->VoidPtrTy); 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 714839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananclass NullDiagnosticClient : public DiagnosticClient 715839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan{ 716839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananpublic: 717839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan NullDiagnosticClient () 718839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan { 719839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 720839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan } 721839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan 722839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 723839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan { 724839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan if (m_log) 725839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan { 726839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 727839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan info.FormatDiagnostic(diag_str); 728839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan diag_str.push_back('\0'); 729839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 730839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan } 731839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan } 732839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananprivate: 733839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan Log *m_log; 734839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan}; 735839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan 736462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 737462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CopyType (ASTContext *dest_context, 738462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *source_context, 739462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 741ad5b61b871bace8dd7b28862662ed7f165d47267Sean Callanan // null_client's ownership is transferred to diagnostics 742839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan NullDiagnosticClient *null_client = new NullDiagnosticClient; 743839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan Diagnostic diagnostics(null_client); 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileManager file_manager; 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTImporter importer(diagnostics, 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *dest_context, file_manager, 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *source_context, file_manager); 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type)); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ret.getAsOpaquePtr(); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7528d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 753462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context, 754462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 755462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 7565510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 7575510dddc33260a991284ef81ca343594f23262e8Sean Callanan return ast_context->hasSameType(QualType::getFromOpaquePtr(type1), 7585510dddc33260a991284ef81ca343594f23262e8Sean Callanan QualType::getFromOpaquePtr(type2)); 7595510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 7605510dddc33260a991284ef81ca343594f23262e8Sean Callanan 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 763462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 764462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 775462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 776462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 787462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 788462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 801462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 802585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 80604325065a00f646527db85e9bc751da29ac53b23Sean Callanan 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 811585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 8129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 813306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 8149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 8159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 8169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 8179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context, 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(decl).getAsOpaquePtr(); 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 832dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 833dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 834dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 835dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 836dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 837dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 838dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (::strstr(name, "operator ") != name) 839dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 840dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 841dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton const char *post_op_name = name + 9; 842dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 843dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 844dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 845dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 846dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 847dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 848dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 849dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 850dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 851dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 852dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 853dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 854dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 855dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 856dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 857dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 858dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 859dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 860dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 861dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 862dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 863dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 864dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 865dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 866dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 867dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 868dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 869dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 870dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 871dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 872dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 873dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 874dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 875dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 876dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 877dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 878dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 879dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 886dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 887dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 888dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 889dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 890dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 891dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 892dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 893dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 894dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 895dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 896dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 897dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 898dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 899dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 900dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 901dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 902dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 903dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 904dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 905dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 913dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 914dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 915dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 916dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 918dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 919dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 927dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 928dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 997dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 998dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 999dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1000dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1001dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1002dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1003dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1004dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1005dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1006dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1007dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1008dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1009dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1010dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1011dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1012dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1013dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1014dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1015dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1016dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1017dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1018dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1019dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1020dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1021dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1022dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1023412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1024795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1025795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1026462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1027462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1028412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1029462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1030412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 10311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 10321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 103330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 103430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1035412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1036795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 10373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1038974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1039795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1040795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(ast_context); 1041795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1042795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 1043795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1044795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1045795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 10471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 10481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *clang_type(record_qual_type.getTypePtr()); 1049795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type == NULL) 1051412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1052795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordType *record_clang_type(dyn_cast<RecordType>(clang_type)); 1054795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_clang_type == NULL) 1056412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1057795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordDecl *record_decl = record_clang_type->getDecl(); 1059795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_decl == NULL) 1061412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1062795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1063795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 1064795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1066412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1067795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 10691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 107030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 10713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 107230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 107390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 107490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 107590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 10765325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 107790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 10785325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 107990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 108090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 10815325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 108230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 108390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 108490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 108590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 108690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 108790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 108890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 108990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 109090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast_context, 109190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 10925325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 109390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 109490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 109590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 109690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 109790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton else if (decl_name == record_decl->getDeclName()) 109830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 109930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast_context, 110030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 11015325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 110230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 110330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 110430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 110530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 110630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 110730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 110830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 110990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1110dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1111dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1112dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 111390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1114dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1115dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1116dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 111790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1118dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 111990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 112090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1121dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1122dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1123dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline); 1124dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1125dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1126dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1127dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1128dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast_context, 1129dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 11305325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1131dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1132dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1133dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1134dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_explicit); 1135dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 113690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1137dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1138dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 113990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 114090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 114190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1142dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 114390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 114490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 114590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 114690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 114790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline); 114890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 114930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1151462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 115247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 11531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 11541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 115547a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 11563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 11573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 11593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 11613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 11623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 11633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 11641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params[param_index] = ParmVarDecl::Create (*ast_context, 11651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 11661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 11671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 11681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 11691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 11701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 11711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 11721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 11733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 11763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 1178795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1179412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1180795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1181795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1182795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 118384f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 118484f8075072eef306234f8109573067647735c111Greg Clayton( 1185462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1186462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 118784f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1188462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 118984f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 119084f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 119184f8075072eef306234f8109573067647735c111Greg Clayton) 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119660a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 121647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 121884f8075072eef306234f8109573067647735c111Greg Clayton FieldDecl *field = FieldDecl::Create (*ast_context, 121984f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 122084f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 122184f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 122284f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 122384f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 122484f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 122584f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122784f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 12359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 12379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 12389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 124060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan ClangASTContext::AddObjCClassIVar (ast_context, 124160a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 12429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 12439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 12449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 12459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 12461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 12479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context == NULL || field == NULL) 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context)) 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1313462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type) 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 13181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = qual_type.getTypePtr(); 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl) 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx; 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++field_idx) 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no accessibility was assigned, assign the correct one 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field->setAccess ((AccessSpecifier)default_accessibility); 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1346462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 13496e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 13506e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 13516e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 13526e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 13536e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type))); 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1357e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1358e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1359e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1360e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1361e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1362e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1363e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1364e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1365e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1366e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1368462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl()); 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setBases(base_classes, num_base_classes); 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 138984f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 139084f8075072eef306234f8109573067647735c111Greg Clayton 1391462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 139284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 139384f8075072eef306234f8109573067647735c111Greg Clayton( 139484f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 139584f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 139684f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 139784f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 139884f8075072eef306234f8109573067647735c111Greg Clayton) 139984f8075072eef306234f8109573067647735c111Greg Clayton{ 140084f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 140184f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 140284f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 140384f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 140484f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx = ast_context->getTranslationUnitDecl(); 140584f8075072eef306234f8109573067647735c111Greg Clayton 140684f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 140784f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 140884f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 140984f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 141084f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 141184f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context, 141284f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 141384f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 141484f8075072eef306234f8109573067647735c111Greg Clayton &ast_context->Idents.get(name), 141584f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 141684f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 141784f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 14189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr(); 142084f8075072eef306234f8109573067647735c111Greg Clayton} 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142284f8075072eef306234f8109573067647735c111Greg Claytonbool 1423462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 142484f8075072eef306234f8109573067647735c111Greg Clayton{ 142584f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 142684f8075072eef306234f8109573067647735c111Greg Clayton { 142784f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 142884f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 142984f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 143084f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 143184f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 143284f8075072eef306234f8109573067647735c111Greg Clayton { 143384f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 143484f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 143584f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 143684f8075072eef306234f8109573067647735c111Greg Clayton { 143784f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 143884f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 143984f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 144084f8075072eef306234f8109573067647735c111Greg Clayton { 144184f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 144284f8075072eef306234f8109573067647735c111Greg Clayton return true; 144384f8075072eef306234f8109573067647735c111Greg Clayton } 144484f8075072eef306234f8109573067647735c111Greg Clayton } 144584f8075072eef306234f8109573067647735c111Greg Clayton } 144684f8075072eef306234f8109573067647735c111Greg Clayton } 144784f8075072eef306234f8109573067647735c111Greg Clayton return false; 144884f8075072eef306234f8109573067647735c111Greg Clayton} 144984f8075072eef306234f8109573067647735c111Greg Clayton 145084f8075072eef306234f8109573067647735c111Greg Clayton 145184f8075072eef306234f8109573067647735c111Greg Claytonbool 145284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 145384f8075072eef306234f8109573067647735c111Greg Clayton( 1454462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1455462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 145684f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1457462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 145884f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 145984f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 14601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 146184f8075072eef306234f8109573067647735c111Greg Clayton) 146284f8075072eef306234f8109573067647735c111Greg Clayton{ 146384f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 146484f8075072eef306234f8109573067647735c111Greg Clayton return false; 146584f8075072eef306234f8109573067647735c111Greg Clayton 146660a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 146784f8075072eef306234f8109573067647735c111Greg Clayton 146884f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 146984f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 147084f8075072eef306234f8109573067647735c111Greg Clayton 147184f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 147284f8075072eef306234f8109573067647735c111Greg Clayton 147384f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 147484f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 147584f8075072eef306234f8109573067647735c111Greg Clayton { 147684f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 147784f8075072eef306234f8109573067647735c111Greg Clayton 147884f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 147984f8075072eef306234f8109573067647735c111Greg Clayton { 148084f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 148184f8075072eef306234f8109573067647735c111Greg Clayton 148284f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 148384f8075072eef306234f8109573067647735c111Greg Clayton { 148484f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 148584f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 148684f8075072eef306234f8109573067647735c111Greg Clayton { 148784f8075072eef306234f8109573067647735c111Greg Clayton APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 148847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 148984f8075072eef306234f8109573067647735c111Greg Clayton } 149084f8075072eef306234f8109573067647735c111Greg Clayton 14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context, 14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 14939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 14949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 14959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 14969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 14979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 14989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 14991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 15009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 15029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 15049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 15059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 150684f8075072eef306234f8109573067647735c111Greg Clayton } 150784f8075072eef306234f8109573067647735c111Greg Clayton } 150884f8075072eef306234f8109573067647735c111Greg Clayton } 150984f8075072eef306234f8109573067647735c111Greg Clayton return false; 151084f8075072eef306234f8109573067647735c111Greg Clayton} 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15139488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1514462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 15159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 15169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 15179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 15199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 15209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 15229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 15249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 15259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 15279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 15309488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 15339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 15359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 15409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 15419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 15439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 15441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1545462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 15461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 15471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1548462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1549462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 15501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1551462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 15521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 15531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 15541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 15551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 15561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton IdentifierTable *identifier_table = &ast_context->Idents; 15591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (ast_context != NULL); 15611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 15621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 15641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 15661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 15671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 15701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 15721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 15751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 15771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 15801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 15811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 15841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 15851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 15871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1588ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 15891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1590ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1591ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1592ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1593ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 15941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1595ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 15961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1597ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 15986bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 15996bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1600ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 16011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 16026bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 16036bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 16041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 16081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 16091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1610ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 16111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 16121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 16141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *method_type(method_qual_type.getTypePtr()); 16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 16221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 16241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 16291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 16311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 16331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context, 16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 16361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 16371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 16441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 16461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 16541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 16551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 16571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 16581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params.push_back (ParmVarDecl::Create (*ast_context, 16591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 16601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 16611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 16621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 16631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 16641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 16651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 16661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 16671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args); 16701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 16721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 16731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 16761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 16771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 1680f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 1681f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 1682f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 1683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang::ASTContext *ast_context, 1684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 1685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 1686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 1687bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 1688f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 1689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1690f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1691f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 1692bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1693bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1694bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1695bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1696bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 1697bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 169804325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 169904325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 170004325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 170104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 170204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 1703f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (ast_context && pointee_or_element_clang_type) 1704f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 170504325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 1706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 1708f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 170904325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 171004325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 1711f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 1713f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1714f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 1716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1717bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Complex: return eTypeHasChildren | eTypeIsBuiltIn | eTypeHasValue; 1718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 1720f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 1721f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 1722f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 1723f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1724f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 1725f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 1726f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1727bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 1728bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 1729bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 1730bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 1731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 1733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 1735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 1736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1737bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 1738bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 1739bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 1740bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 1741bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 1742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1743f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 1744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 1745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 1747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 1748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 1750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1751f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 1752f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 1755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1756bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 1757bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 1758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 1760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 1763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1764bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 1765bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 1766bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 1767bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 1769bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 1770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 1771bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 1772bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 1773f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1774f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 1775f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 1776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ast_context, 1777f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 1778f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1779bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 1780bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 1781bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 1782bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 1783bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 1784bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1785bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 1786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1787bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 17889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1792462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type->isAggregateType ()) 180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 180303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 18061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 18071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 18081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 18091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 18101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 18119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 18129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 1826462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes) 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type == NULL) 182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 18339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 18349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1836960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1837960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 1838960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1839f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 1840960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 1841960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1842f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1843960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1844960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1845960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1846960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1847960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1848960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 18491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 18919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 18929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 18949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 18959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 18969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 18989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 19009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 19099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 19129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 19159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 1921960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1922960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 1923960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 1924960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1925960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 1926960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 1927960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 1928960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1929960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 1930960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 1931960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1932960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 19339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 19429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 19439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If this type points to a simple type, then it has 1 child 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = 1; 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1952f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 1953f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 1954f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1955f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 1956f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 1957f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1958f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 1959f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 1960f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 1961f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 1962f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 1963f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 1964f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1965f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1966f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1967f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 19681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes); 197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1979462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 1983462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 198624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 198724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 198824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 198924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 199024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 1991bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 1992bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool &child_is_base_class 199324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 199424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 199524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 199624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 199824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 199924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 200024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2007bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2008bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 201124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2012462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 201524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2017462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2025bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 2026bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool &child_is_base_class 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes)) 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2037bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 203903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 204003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2042960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2043960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2044960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2045960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2046960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 204704325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 204804325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_byte_size = ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / CHAR_BIT; 2049960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 2050960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2051960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2052960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2053960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2054960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2055960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2056960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 20571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getVBaseClassOffset(base_class_decl); 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getBaseClassOffset(base_class_decl); 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType()); 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2107bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType()); 212954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size)) 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 21469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 21479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 21499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 21509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 21519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 21539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 21549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 21569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl); 21599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 21609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 21619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 21639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2164960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 21659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 21679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl)); 21699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 21729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 21749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2176960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2177bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 21839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 21869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 21879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2188960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2189960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 21909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 21929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 21949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 21969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 21989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 22029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 22049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 22069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 22089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 2210960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 22119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 22149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 22169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 22249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2225960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2226960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2227960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2228960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2229960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2230960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return GetChildClangTypeAtIndex (ast_context, 2231960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2232960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2233960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2234960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2235960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2236960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2237960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2238960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2239960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2240bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2241bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 2242960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2243960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2244960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2245960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2246960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2247960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2248960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2249960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2250960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2251960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2252960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2253960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2254960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2255960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2256960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2257960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2258960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2259960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2260960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 22619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2273bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton char element_name[64]; 2274bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(element_name); 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(field_type_info.first % 8 == 0); 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = idx * child_byte_size; 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return array->getElementType().getAsOpaquePtr(); 228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2302bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2303bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2326f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2327f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2328f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2329f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2330f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2331f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2332f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2333f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2334f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return GetChildClangTypeAtIndex (ast_context, 2335f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2336f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2337f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2338f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2339f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 2340f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2341f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2342f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2343f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2344f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 2345f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_is_base_class); 2346f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2347f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2348f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2349f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2350f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2351f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2352f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2353f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2354f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2355f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2356f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2357f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2358f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2359f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2360f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2361f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2362f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2363f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2364f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2365f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2366f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2367f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 23681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2379bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2380bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2387f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false; 239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2568462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 257703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 257803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name)); 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 26689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 26699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 26719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 26729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 26739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 26749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 26769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 26779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 26799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 26819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 26829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2683823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 26849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 26869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 26889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 26909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 26919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 26949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 26959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 26999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 27019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 27029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 27039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 27049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (GetIndexOfChildMemberWithName (ast_context, 27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 27279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildMemberWithName (ast_context, 27299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 27309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 27319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 27329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 27339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 27731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2846462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 28549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 285503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 28569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 285703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 29029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 29039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 29059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 29069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 29079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 29089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 29109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 29119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 29139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 29159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 29169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 29189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 29209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 29229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 29249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 29259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 29269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 29289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 29329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 29349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 29359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 29409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 29429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildWithName (ast_context, 29449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 29459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 29469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 29479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 29499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 29851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 29861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3050462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 30551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3077462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 308303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 308403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 30879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 30889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 30899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 30909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 30919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 30929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 30939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 30949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 30959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 30969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 30979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 30989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 30999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 31009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 31019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 31029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 31039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 31049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 31059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 31069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 31089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 31099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 31109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 31119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name)); 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3138462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (&ast_context->Idents.get(name)), 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3173462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3174462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context, 3175462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3176462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 31772ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 31782ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 31792ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type), 318853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 31902ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan is_variadic, 31912ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan type_quals, 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasExceptionSpec 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasAnyExceptionSpec, 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // NumExs 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // const QualType *ExArray 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn); 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3200462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ParmVarDecl::Create(*ast_context, 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 32082ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3225462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3226462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3245462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 32501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3269462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 327455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 327555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 327655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 327755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 327955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 328055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 328155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 328255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 328355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 328404325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 328504325065a00f646527db85e9bc751da29ac53b23Sean Callanan 328604325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 328704325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 328804325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 328904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 329004325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 329104325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 329204325065a00f646527db85e9bc751da29ac53b23Sean Callanan 329355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 329455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 329555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 329655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 329755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 329855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 329955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 330255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 330355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 330455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 330555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 330648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton ASTContext *ast_context = getASTContext(); 330748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 330848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 330948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 331048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 331148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (ast_context->getTypeSize(enum_decl->getIntegerType()) < ast_context->getTypeSize(ast_context->IntTy)) 331248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 331348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 331448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = ast_context->IntTy; 331548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 331648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = ast_context->UnsignedIntTy; 331748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 331848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 331948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 332048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 332148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 332255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3332462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3333462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name, clang_type_t integer_qual_type) 333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 333948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 334048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 334148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 334248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 334348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 334448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast_context, 334548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton ast_context->getTranslationUnitDecl(), 334648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 334748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton name && name[0] ? &ast_context->Idents.get(name) : NULL, 334848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 334948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton NULL); //IsScoped, IsFixed); 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3351e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3352e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3353e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr(); 3355e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3359462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3360462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3361462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3362462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3363462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3364462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 3365462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3366462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3367462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3368462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3369462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3370462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3371462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3372462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3373462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3374462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3375462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3376462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3380462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3381462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl::Create(*ast_context, 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl(), 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(enumerator_clang_type), 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint); 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3430462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3431462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 34347b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 34357b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 34367b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 343703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 343803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 34397b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 34407b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 34417b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 34427b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 34437b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 34447b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 34457b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getPointerType(qual_type).getAsOpaquePtr(); 34467b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 34477b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3451462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3452462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateLValueReferenceType (clang_type_t clang_type) 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3459462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3460462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateRValueReferenceType (clang_type_t clang_type) 346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3467462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3468462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3469fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3470fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3471fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3472fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3473fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3474fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3475fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(ast_context->VoidPtrTy); 348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3484462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 349003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 349103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 349304325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 349404325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 349504325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 349604325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 349704325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 349804325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 349904325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 350004325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 350104325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 350204325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 35031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 350524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 350624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 350924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3536462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3556462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 355924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 356103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 356203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 356404325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 356504325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 356604325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 356704325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 356804325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 356904325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 357004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 357104325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 357204325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 357304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 35741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type); 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3600462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3638bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3639bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 3640bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 3641bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 3642bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 3643bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3644bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3645bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3646bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 3647bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 3648bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3649bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 3650bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 3651bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3652bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3653bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 3654bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 3655bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 3656bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3657bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 36581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3659462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 36601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 36611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 36621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 36631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 36641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 36651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 36661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 36671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 36681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 36691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 36701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3671462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 36721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 36731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 36741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 36751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 36761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 36771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 36781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 36791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 36801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 36811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 36821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 3683f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 3684f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 3685f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 3686f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 3687f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 3688f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 3689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 369024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3692462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3694f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 3695f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 3696f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3697f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 3698f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 3699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3700f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 370124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3702f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 3703f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3704f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3709f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 3710f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 3711f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 3712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3714f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 371524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 3717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 371824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 372324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3726462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 372703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 372803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 372903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 373003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 373103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 373203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 373303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 373403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 373503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 373603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 373703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 373803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 373903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 374003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 374103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 374203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 374303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 374403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 374503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 374603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 374703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 374803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 374903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 375003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 375103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 375203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 375303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 3754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 3755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 3756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 3757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 3758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 3760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (array) 3761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return array->getSize().getLimitedValue(); 3762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 3763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 3764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 376503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 376603e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 3767462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 376924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 377124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 377224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 377324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 377403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 377503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 377624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 377824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 378724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 378824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 379124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 379224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 379324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 37941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3807462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3808462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypedefDecl *decl = TypedefDecl::Create(*ast_context, 382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->CreateTypeSourceInfo(qual_type)); 382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 382624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypedefType (decl).getAsOpaquePtr(); 382724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 383024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 3833462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 383524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3837462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 383824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3839462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 384024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3842462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefDecl *typedef_decl = typedef_type->getDecl(); 384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 385424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 385824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 385924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 3860462d4147f3bb9141bf62d904f58a623db00669dfGreg 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) 386124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 386224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 386424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 386524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 386924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 387424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 387524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 387624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 387924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 388124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 388624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 388724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 389024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 389324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 389424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 3895462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 389624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 389724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 389824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 389924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 390324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref); 391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t bit_size = ast_context->getTypeSize (qual_type); 391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 391724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 391824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 391924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 392024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 392124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 392224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 392324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 392424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 392624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 392724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 392824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 392924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 393024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 393124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3932a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3933a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 3934462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 3935a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 3936a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 3937a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3938a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3939a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3940a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 3941a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 3942