ClangASTContext.cpp revision e52f37baba95cc60d2fc78d9f8726dff5c3f3720
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" 268a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan#include "clang/Basic/FileSystemOptions.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h" 32bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h" 35f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h" 36839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h> 39f05633b35544b5d095feb05680c8728be087e441Eli Friedman 40585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4584f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 46585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 4784f8075072eef306234f8109573067647735c111Greg Clayton{ 4884f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 4984f8075072eef306234f8109573067647735c111Greg Clayton { 50585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 51585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 52585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 53585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 54585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 5584f8075072eef306234f8109573067647735c111Greg Clayton } 5684f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 5784f8075072eef306234f8109573067647735c111Greg Clayton} 5884f8075072eef306234f8109573067647735c111Greg Clayton 5984f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 60585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 6184f8075072eef306234f8109573067647735c111Greg Clayton{ 6284f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 6384f8075072eef306234f8109573067647735c111Greg Clayton { 64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 65585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 66585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 67585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 68585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 69585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 7084f8075072eef306234f8109573067647735c111Greg Clayton } 7184f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 7284f8075072eef306234f8109573067647735c111Greg Clayton} 7384f8075072eef306234f8109573067647735c111Greg Clayton 7484f8075072eef306234f8109573067647735c111Greg Clayton 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 79e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 87e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 89e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 90e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 91e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 92e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 101e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 102e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(0 && "Invalid input kind!"); 104e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 107e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 108e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 109e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 110e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 114e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 115e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 116e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 117e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 1658950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan Opts.setVisibilityMode(DefaultVisibility); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 239e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::ClangASTContext(const char *target_triple) : 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap(), 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap() 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset(); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_ast_context_ap.get() == NULL) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_ast_context_ap.reset( 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new ASTContext( 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getLanguageOptions(), 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSourceManager(), 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getTargetInfo(), 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getIdentifierTable(), 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *getSelectorTable(), 3136e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton *getBuiltinContext(), 3146e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton 0)); 315887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 316887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_ast_context_ap->getDiagnostics().setClient(getDiagnosticClient(), false); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ast_context_ap.get(); 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 343e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 344e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3578a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager * 3588a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager() 3598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 3608a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_manager_ap.get() == NULL) 36122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton { 36222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton clang::FileSystemOptions file_system_options; 36322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_file_manager_ap.reset(new clang::FileManager(file_system_options)); 36422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton } 3658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_manager_ap.get(); 3668a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 3678a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 3681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 37222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager())); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 380eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton { 381eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs()); 382eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton m_diagnostic_ap.reset(new Diagnostic(diag_id_sp)); 383eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton } 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 387887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient 388887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 389887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic: 390887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan NullDiagnosticClient () 391887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 392887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 393887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 394887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 395887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 396887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 397887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_log) 398887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 399887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 400887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan info.FormatDiagnostic(diag_str); 401887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan diag_str.push_back('\0'); 402887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 403887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 404887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 405887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate: 406887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan LogSP m_log; 407887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}; 408887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 409887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient * 410887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient() 411887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 412887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_diagnostic_client_ap.get() == NULL) 413887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_diagnostic_client_ap.reset(new NullDiagnosticClient); 414887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 415887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan return m_diagnostic_client_ap.get(); 416887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan} 417887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type) 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 451462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 452585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 461462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 462462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ast_context) 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 469585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 474585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 489585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 504585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 513585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 521462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context) 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy)) 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->BoolTy.getAsOpaquePtr(); 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 551e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case DW_ATE_lo_user: 552e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton // This has been seen to mean DW_AT_complex_integer 553e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton if (strcmp(type_name, "complex") == 0) 554e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 555e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2); 556e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton return ast_context->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr(); 557e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 558e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton break; 559e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy)) 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatComplexTy.getAsOpaquePtr(); 563e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy)) 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleComplexTy.getAsOpaquePtr(); 565e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy)) 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleComplexTy.getAsOpaquePtr(); 567e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else 568e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 569e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2); 570e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton return ast_context->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr(); 571e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5868ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5888ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 5898ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->LongLongTy.getAsOpaquePtr(); 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5918ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5968ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6018ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6088ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 6098ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 6108ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 6118ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->IntTy.getAsOpaquePtr(); 6128ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 6138ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->Int128Ty.getAsOpaquePtr(); 6148ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 6158ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (streq(type_name, "wchar_t")) 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy)) 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->WCharTy.getAsOpaquePtr(); 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6548ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 6578ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6598ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6648ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6698ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6748ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 6758ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 6768ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 6778ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->UnsignedIntTy.getAsOpaquePtr(); 6788ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 6798ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 6808ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 712462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 713462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context) 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 715a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return ast_context->VoidTy.getAsOpaquePtr(); 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 718462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 719a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool() 720a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{ 721a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan return getASTContext()->BoolTy.getAsOpaquePtr(); 722a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan} 723a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan 724a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t 725960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 726960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 727c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr(); 728960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 729960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 730462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 731960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 732960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 73304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 734960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 735960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 736462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 737960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 738960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 739c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr(); 740960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 741960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 742462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 753462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 759462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 760462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const) 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType void_ptr_type(ast_context->VoidPtrTy); 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 770462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 77122defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast, 77222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 773462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7758a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 77622defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 77722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 77822defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton *src_ast, file_manager); 779cf18faaf72090a68480145ca206955d792633559Sean Callanan 78022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType src (QualType::getFromOpaquePtr(clang_type)); 78122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType dst (importer.Import(src)); 782cf18faaf72090a68480145ca206955d792633559Sean Callanan 783cf18faaf72090a68480145ca206955d792633559Sean Callanan return dst.getAsOpaquePtr(); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7866916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 7876916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl * 78822defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast, 78922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 7906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *source_decl) 791887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 7928a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 79322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 79422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 79522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton *src_ast, file_manager); 7966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 7976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return importer.Import(source_decl); 7986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 7996916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 8008d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 801462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context, 802462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 803462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 8045510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 8055510dddc33260a991284ef81ca343594f23262e8Sean Callanan return ast_context->hasSameType(QualType::getFromOpaquePtr(type1), 8065510dddc33260a991284ef81ca343594f23262e8Sean Callanan QualType::getFromOpaquePtr(type2)); 8075510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 8085510dddc33260a991284ef81ca343594f23262e8Sean Callanan 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 811462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 812462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 823462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 824462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 835462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 836462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 849462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 850585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 85404325065a00f646527db85e9bc751da29ac53b23Sean Callanan 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 859585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 8609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 861306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 8629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 8639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 8649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 8659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context, 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL); 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(decl).getAsOpaquePtr(); 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 886494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator" 887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 888c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 889c2c9a149f127736550d7430653f4c1a51731442eSean Callanan const char *post_op_name = NULL; 890c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 891494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan bool no_space = true; 892c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 894494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan return false; 895494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan 896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton post_op_name = name + OPERATOR_PREFIX_LENGTH; 897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 898494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan if (post_op_name[0] == ' ') 899c2c9a149f127736550d7430653f4c1a51731442eSean Callanan { 900494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan post_op_name++; 901494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan no_space = false; 902c2c9a149f127736550d7430653f4c1a51731442eSean Callanan } 903c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 904494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX 905427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH 906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 913c2c9a149f127736550d7430653f4c1a51731442eSean Callanan default: 914c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 915c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 916c2c9a149f127736550d7430653f4c1a51731442eSean Callanan break; 917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 918c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 919c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 927c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 928c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 997dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 998dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 999dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1000dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1001dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1002dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 1003dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 1004dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1005dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1006dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1007dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1008dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 1009dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1010dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 1011dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1012dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1013dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1014dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1015dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 1016dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 1017dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1018dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1019dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1020dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1021dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 1022dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1023dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 1024dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1025dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1026dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 1027dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1028dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 1029dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1030dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 1031dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1032dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1033dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 1034dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1035dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 1036dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1037dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 1038dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1039dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1040dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 1041dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1042dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 1043dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1044dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1045dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1046dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1047dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 1048dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 1049dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1050dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1051dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1052dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1053dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 1054dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 1055dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1056dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1057dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1058dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 1059dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1060dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 1061dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1062dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1063dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1064dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1065dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 1066dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 1067dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1068dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1069dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 1070dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 1071dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1072dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1073dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1074dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1075dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1076dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1077dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1078dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1079dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1080dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1081dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1082dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1083dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1084dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1085dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1086dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1087dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1088dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1089dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1090dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1091dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1092dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1093dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1094dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1095412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1096795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1097795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1098462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1099462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1100412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1101462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1102412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 11031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 11041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 110530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 110630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1107412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1108795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 11093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1110974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1111795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1112795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(ast_context); 1113795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1114795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 1115795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1116795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1117795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 11191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 11201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *clang_type(record_qual_type.getTypePtr()); 1121795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type == NULL) 1123412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1124795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordType *record_clang_type(dyn_cast<RecordType>(clang_type)); 1126795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_clang_type == NULL) 1128412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1129795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordDecl *record_decl = record_clang_type->getDecl(); 1131795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_decl == NULL) 1133412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1134795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1135795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 1136795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1138412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1139795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 11411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 114230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 11433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 114430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 114590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 114690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 114790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 11485325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 114990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 11505325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 115190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 115290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 11535325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 115430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 115590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 115690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 115790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 115890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 115990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 116090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 116190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 116290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast_context, 116390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 11645325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 116590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 11668950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, 116790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 116890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 116990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 117090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton else if (decl_name == record_decl->getDeclName()) 117130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 117230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast_context, 117330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 11745325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 117530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 117630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 117730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 117830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 117930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 118030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 118130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 118290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1183dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 118690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 119090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 119290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 119390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline); 1197dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast_context, 1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 12035325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_explicit); 1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 120990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 121290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 121390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 121490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 121690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 121790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 121890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 121990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 122090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline); 122190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 122230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1224462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 122547a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 12261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 12271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 122847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 12293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 12303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 12323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 12343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 12353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 12363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 12371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params[param_index] = ParmVarDecl::Create (*ast_context, 12381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 12391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 12401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 12411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 12421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 12431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 12441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 12451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 12463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 12493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 1251795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1252412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1253795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1254795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1255795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 125684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 125784f8075072eef306234f8109573067647735c111Greg Clayton( 1258462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1259462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 126084f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1261462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 126284f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 126384f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 126484f8075072eef306234f8109573067647735c111Greg Clayton) 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 128947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129184f8075072eef306234f8109573067647735c111Greg Clayton FieldDecl *field = FieldDecl::Create (*ast_context, 129284f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 129384f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 129484f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 129584f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 129684f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 129784f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 129884f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130084f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 13089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 13099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 13109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 13119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 13121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 131360a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan ClangASTContext::AddObjCClassIVar (ast_context, 131460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 13159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 13169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 13179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 13189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 13191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 13209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 13219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context == NULL || field == NULL) 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context)) 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1386462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type) 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 13911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = qual_type.getTypePtr(); 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl) 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx; 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++field_idx) 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no accessibility was assigned, assign the correct one 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field->setAccess ((AccessSpecifier)default_accessibility); 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1419462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 14226e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 14236e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 14246e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 14256e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 14266e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type))); 142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1430e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1431e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1432e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1433e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1434e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1435e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1436e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1437e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1438e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1439e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1441462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl()); 145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setBases(base_classes, num_base_classes); 145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 146284f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 146384f8075072eef306234f8109573067647735c111Greg Clayton 1464462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 146584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 146684f8075072eef306234f8109573067647735c111Greg Clayton( 146784f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 146884f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 146984f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 147084f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 147184f8075072eef306234f8109573067647735c111Greg Clayton) 147284f8075072eef306234f8109573067647735c111Greg Clayton{ 147384f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 147484f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 147584f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 147684f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 147784f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx = ast_context->getTranslationUnitDecl(); 147884f8075072eef306234f8109573067647735c111Greg Clayton 147984f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 148084f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 148184f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 148284f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 148384f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 148484f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context, 148584f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 148684f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 148784f8075072eef306234f8109573067647735c111Greg Clayton &ast_context->Idents.get(name), 148884f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 148984f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 149084f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 14919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr(); 149384f8075072eef306234f8109573067647735c111Greg Clayton} 149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149584f8075072eef306234f8109573067647735c111Greg Claytonbool 1496462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 149784f8075072eef306234f8109573067647735c111Greg Clayton{ 149884f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 149984f8075072eef306234f8109573067647735c111Greg Clayton { 150084f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 150184f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 150284f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 150384f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 150484f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 150584f8075072eef306234f8109573067647735c111Greg Clayton { 150684f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 150784f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 150884f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 150984f8075072eef306234f8109573067647735c111Greg Clayton { 151084f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 151184f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 151284f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 151384f8075072eef306234f8109573067647735c111Greg Clayton { 151484f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 151584f8075072eef306234f8109573067647735c111Greg Clayton return true; 151684f8075072eef306234f8109573067647735c111Greg Clayton } 151784f8075072eef306234f8109573067647735c111Greg Clayton } 151884f8075072eef306234f8109573067647735c111Greg Clayton } 151984f8075072eef306234f8109573067647735c111Greg Clayton } 152084f8075072eef306234f8109573067647735c111Greg Clayton return false; 152184f8075072eef306234f8109573067647735c111Greg Clayton} 152284f8075072eef306234f8109573067647735c111Greg Clayton 152384f8075072eef306234f8109573067647735c111Greg Clayton 152484f8075072eef306234f8109573067647735c111Greg Claytonbool 152584f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 152684f8075072eef306234f8109573067647735c111Greg Clayton( 1527462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1528462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 152984f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1530462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 153184f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 153284f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 153484f8075072eef306234f8109573067647735c111Greg Clayton) 153584f8075072eef306234f8109573067647735c111Greg Clayton{ 153684f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 153784f8075072eef306234f8109573067647735c111Greg Clayton return false; 153884f8075072eef306234f8109573067647735c111Greg Clayton 153960a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 154084f8075072eef306234f8109573067647735c111Greg Clayton 154184f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 154284f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 154384f8075072eef306234f8109573067647735c111Greg Clayton 154484f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 154584f8075072eef306234f8109573067647735c111Greg Clayton 154684f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 154784f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 154884f8075072eef306234f8109573067647735c111Greg Clayton { 154984f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 155084f8075072eef306234f8109573067647735c111Greg Clayton 155184f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 155284f8075072eef306234f8109573067647735c111Greg Clayton { 155384f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 155484f8075072eef306234f8109573067647735c111Greg Clayton 155584f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 155684f8075072eef306234f8109573067647735c111Greg Clayton { 155784f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 155884f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 155984f8075072eef306234f8109573067647735c111Greg Clayton { 156084f8075072eef306234f8109573067647735c111Greg Clayton APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 156147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 156284f8075072eef306234f8109573067647735c111Greg Clayton } 156384f8075072eef306234f8109573067647735c111Greg Clayton 15649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context, 15659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 15669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 15679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 15689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 15699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 15709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 15719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 15721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 15789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 157984f8075072eef306234f8109573067647735c111Greg Clayton } 158084f8075072eef306234f8109573067647735c111Greg Clayton } 158184f8075072eef306234f8109573067647735c111Greg Clayton } 158284f8075072eef306234f8109573067647735c111Greg Clayton return false; 158384f8075072eef306234f8109573067647735c111Greg Clayton} 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15869488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1587462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 15889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 15899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 15909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 15929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 15939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 15959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 15979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 15989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 16009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 16019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 16029488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 16039488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 16049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 16059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 16069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 16079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 16089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 16099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 16109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 16119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 16129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 16139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 16149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 16159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 16169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1618462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1621462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1622462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1624462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 16251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 16261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 16271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 16291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton IdentifierTable *identifier_table = &ast_context->Idents; 16321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (ast_context != NULL); 16341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 16371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 16541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 16571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 16581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 16601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1661ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 16621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1663ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1664ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1665ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1666ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 16671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1668ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 16691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1670ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 16716bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 16726bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1673ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 16741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 16756bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 16766bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 16771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 16811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 16821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1683ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 16841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 16851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 16871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 16891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *method_type(method_qual_type.getTypePtr()); 16901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 16921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 16951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 16971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 17011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 17021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 17031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 17041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 17061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context, 17081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 17091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 17101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 17111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 17121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 17131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 17141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 17151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 17161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 17171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 17181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 17191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 17201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 17231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 17241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 17261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 17271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 17281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 17301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 17311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params.push_back (ParmVarDecl::Create (*ast_context, 17321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 17331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 17341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 17351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 17361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 17371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 17381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 17391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 17401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 17411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args); 17431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 17449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 17461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 17491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 17501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1752bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 1754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 1755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 1756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang::ASTContext *ast_context, 1757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 1758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 1759bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 1760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 1761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 1762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 1765bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1766bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1767bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1768bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1769bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 1770bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 177104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 177204325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 177304325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 177404325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 177504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 1776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (ast_context && pointee_or_element_clang_type) 1777f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 177804325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 1779f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1780f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 1781f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 178204325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 178304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 1784f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1785f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 1786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 1789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1790e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue; 1791f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 1793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 1794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 1795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 1796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 1798f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 1799f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 1801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 1802bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 1803bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 1804f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1805f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 1806f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 1808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 1809f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1810bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 1811bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 1812bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 1813bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 1814bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 1815f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1816f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 1817f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 1818f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1819f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 1820f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 1821f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1822bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 1823f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1824f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 1825f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1826f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1827f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 1828f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1829bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 1830bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 1831f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1832f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 1833f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1834f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1835f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 1836f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1837bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 1838bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 1839bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 1840bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1841bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 1842bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 1843bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 1844bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 1845bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 1846f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1847f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 18489e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 1849f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ast_context, 1850f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 1851f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1852bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 1853bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 1854bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 1855bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 1856bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 1857bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1858bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 1859bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1860bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 18619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1865462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 186824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 187203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 187303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 18761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 18771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 18781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 18791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 18801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 18829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 18869e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 1896462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes) 189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type == NULL) 189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1907960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 1908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1909f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 1910960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 1911960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1912f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1914960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1916960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1917960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1918c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 1919e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 0; 1920c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 19211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 192253d287bda5182511685a1dc7961a54b30bf3eedcGreg Clayton if (ClangASTType::IsDefined (clang_qual_type)) 192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 192924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 193124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 193224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 19649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 19659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 19679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 19689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 19699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 19719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 19739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 19769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 19779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 19799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 19819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 19829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 19849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 19859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 19889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 1994960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1995960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 1996960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 1997960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1998960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 1999960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 2000960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 2001960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2002960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2003960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 2004960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2005960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 20069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 2014c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType pointee_type (pointer_type->getPointeeType()); 20159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 20169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 2018c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2019c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We have a pointer to a pointee type that claims it has no children. 2020c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We will want to look at 2021c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr()); 2022c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2028f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2029f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2030f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2031f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 2032f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 2033f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 2034f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 2035f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 2036f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 2037f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 2038f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2039f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 2040f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2041f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2042f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2043f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 20441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 20459e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), omit_empty_base_classes); 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2054c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no 2055c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a 2056c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer, 2057c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type 2058c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show. 2059c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t 2060c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type) 2061c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{ 2062c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (clang_type == NULL) 2063c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2064c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2065c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2066c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2067c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton switch (type_class) 2068c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 20699db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::Type::Builtin: 20709db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 20719db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton { 20729db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Void: 20739db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::NullPtr: 20749db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 0; 20759db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Bool: 20769db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_U: 20779db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UChar: 20789db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char16: 20799db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char32: 20809db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UShort: 20819db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt: 20829db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULong: 20839db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULongLong: 20849db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt128: 20859db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_S: 20869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::SChar: 20879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::WChar: 20889db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Short: 20899db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int: 20909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Long: 20919db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongLong: 20929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int128: 20939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Float: 20949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Double: 20959db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongDouble: 20969db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Dependent: 20979db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Overload: 20989db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UndeducedAuto: 20999db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCId: 21009db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCClass: 21019db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCSel: 21029db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 1; 21039db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton } 21049db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton break; 21059db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 2106e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 1; 2107c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Pointer: return 1; 2108c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 2109c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::LValueReference: return 1; 2110c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::RValueReference: return 1; 2111c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::MemberPointer: return 0; 2112c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ConstantArray: return 0; 2113c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::IncompleteArray: return 0; 2114c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::VariableArray: return 0; 2115c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedArray: return 0; 2116c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedExtVector: return 0; 2117c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Vector: return 0; 2118c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ExtVector: return 0; 2119c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 2120c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 2121c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2122c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Paren: return 0; 2123c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2124c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOfExpr: return 0; 2125c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOf: return 0; 2126c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Decltype: return 0; 2127c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Record: return 0; 2128c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Enum: return 1; 2129c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Elaborated: return 1; 2130c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateTypeParm: return 1; 2131c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::SubstTemplateTypeParm: return 1; 2132c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateSpecialization: return 1; 2133c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::InjectedClassName: return 0; 2134c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentName: return 1; 2135c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentTemplateSpecialization: return 1; 2136c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObject: return 0; 2137c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCInterface: return 0; 2138c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObjectPointer: return 1; 2139c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2140c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton break; 2141c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2142c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2143c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton} 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2145462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2149462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2157bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 2158bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool &child_is_base_class 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2173bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2174bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2178462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2183462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2191bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 2192bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool &child_is_base_class 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes)) 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2203bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 220503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 220603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2208960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2209960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2210960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2211960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2212960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 221304325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 221404325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_byte_size = ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / CHAR_BIT; 2215960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 2216960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2217960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2218960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2219960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2220960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2221960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2222960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 22231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 22578a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity(); 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 22598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity(); 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType()); 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2273bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType()); 229554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size)) 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 23129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 23139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 23169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 23179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 23199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 23209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 23229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl); 23259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 23269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 23279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 23299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2330960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 23319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 23339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl)); 23359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 23389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 23409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2342960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2343bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 23449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 23469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 23499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 23529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 23539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2354960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2355960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 23569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 23589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 23609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 23629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 23649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 23659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 23669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 23689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 23709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 23729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 23749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 2376960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 23779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 23789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 23809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 23829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 23879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 23889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 23909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2391960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2392960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2393960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2394960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2395960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2396960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return GetChildClangTypeAtIndex (ast_context, 2397960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2398960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2399960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2400960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2401960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2402960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2403960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2404960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2405960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2406bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2407bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 2408960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2409960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2410960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2411960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2412960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2413960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2414960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2415960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2416960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2417960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2418960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2419960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2420960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2421960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2422960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2423960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2424960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2425960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2426960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 24279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 24289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 24299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 24301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2439bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton char element_name[64]; 2440bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(element_name); 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(field_type_info.first % 8 == 0); 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = idx * child_byte_size; 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return array->getElementType().getAsOpaquePtr(); 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 24559db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 24569db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton // Don't dereference "void *" pointers 24579db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (pointee_type->isVoidType()) 24589db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return NULL; 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2472bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2473bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2496f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2497f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2498f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2499f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2500f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2501f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2502f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2503f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2504f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return GetChildClangTypeAtIndex (ast_context, 2505f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2506f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 2510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2514f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 2515f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_is_base_class); 2516f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2517f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2524f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2525f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2526f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2528f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2529f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2530f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2531f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2532f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2533f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2534f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2535f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2536f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2537f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 25381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 25419e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2557f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false; 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 270924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2738462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 274703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 274803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name)); 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 28389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 28399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 28419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 28429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 28439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 28449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 28469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 28479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 28499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 28519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 28529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2853823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 28549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 28569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 28589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 28609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 28619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 28629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 28649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 28659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 28699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 28719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 28729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 28739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 28749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (GetIndexOfChildMemberWithName (ast_context, 28769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 28779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 28789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 28799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 28809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 28829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 28839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 28849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 28879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 28889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 28899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 28909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 28949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 28959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 28969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 28979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 28989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildMemberWithName (ast_context, 28999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 29009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 29019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 29029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 29039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 29059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 29421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 29431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 29959e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 3016462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 30249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 302503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 30269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 302703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 30729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 30739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 30759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 30769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 30779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 30789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 30809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 30819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 30829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 30839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 30859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 30869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 30879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 30889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 30909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 30919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 30929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 30949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 30959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 30969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 30979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 30989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 30999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 31029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 31049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 31059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 31109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 31129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildWithName (ast_context, 31149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 31159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 31169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 31179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 313324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 31551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 31561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 32069e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3220462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 32251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3247462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 325303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 325403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 32579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 32589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 32599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 32609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 32619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 32629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 32639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 32649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 32659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 32669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 32679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 32689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 32699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 32709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 32719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 32729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 32739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 32749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 32759e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 32769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 32789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 32799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 32809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 32819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name)); 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3308462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (&ast_context->Idents.get(name)), 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3343462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3344462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context, 3345462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3346462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 33472ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 33482ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 33492ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type), 335853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 33602ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan is_variadic, 33612ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan type_quals, 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasExceptionSpec 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasAnyExceptionSpec, 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // NumExs 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // const QualType *ExArray 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn); 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3370462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ParmVarDecl::Create(*ast_context, 337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 33782ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3395462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3396462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3415462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 34201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3439462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 344455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 344555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 344655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 344755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 344955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 345055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 345155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 345255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 345355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 345404325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 345504325065a00f646527db85e9bc751da29ac53b23Sean Callanan 345604325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 345704325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 345804325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 345904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 346004325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 346104325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 346204325065a00f646527db85e9bc751da29ac53b23Sean Callanan 346355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 346455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 346555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 346655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 346755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 346855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 346955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 347155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 347255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 347355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 347455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 347555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 347648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton ASTContext *ast_context = getASTContext(); 347748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 347848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 347948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 348048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 348148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (ast_context->getTypeSize(enum_decl->getIntegerType()) < ast_context->getTypeSize(ast_context->IntTy)) 348248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 348348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 348448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = ast_context->IntTy; 348548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 348648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = ast_context->UnsignedIntTy; 348748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 348848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 348948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 349048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 349148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 349255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 349524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 349924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 350124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3502462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 35030d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType 35040d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton( 35050d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const char *name, 35060d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton DeclContext *decl_ctx, 35070d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const Declaration &decl, 35080d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton clang_type_t integer_qual_type 35090d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton) 351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 351548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 351648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 351748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 351848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 351948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 352048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast_context, 35210d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton decl_ctx, 352248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 352348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton name && name[0] ? &ast_context->Idents.get(name) : NULL, 352448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 35259e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan NULL, 35269e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScoped 35279e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScopedUsingClassTag 35289e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false); // IsFixed 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3530e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3531e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3532e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr(); 3534e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3538462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3539462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3540462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3541462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3542462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3543462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 3544462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3545462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3546462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3547462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3548462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3549462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3550462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3551462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3552462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3553462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3554462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3555462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3559462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3560462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl::Create(*ast_context, 358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl(), 359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(enumerator_clang_type), 359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint); 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3609462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3610462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3612427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return CreatePointerType (getASTContext(), clang_type); 3613427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3614427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3615427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t 3616427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type) 3617427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3618427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 36197b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 36207b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 36217b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 362203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 362303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 36247b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 36257b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 36267b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 3627427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 36287b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 36297b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 3630427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getPointerType(qual_type).getAsOpaquePtr(); 36317b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 36327b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3636462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 36376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast, 36386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 36416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3645462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 36466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast, 36476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 36506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3654462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3655462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3656fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3657fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3658fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3659fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3660fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3661fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3662fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(ast_context->VoidPtrTy); 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3671462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 367703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 367803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 368004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 368104325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 368204325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 368304325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 368404325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 368504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 368604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 368704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 368804325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 368904325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 36901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 369524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 369624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 369924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 370124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 37159e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 371824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3723462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 372724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 372924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 373024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 373124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 373224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 373424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 373524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 373624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3743462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 374624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 374803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 374903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 375024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 375104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 375204325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 375304325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 375404325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 375504325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 375604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 375704325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 375804325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 375904325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 376004325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 37611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 376224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 376324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 376424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 376824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 377124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 377224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 377424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 377624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 37789e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type); 377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 378324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3787462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 378824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 378924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 379124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 379224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 379324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3825bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3826bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 3827bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 3828bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 3829bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 3830bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3831bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3832bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3833bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 3834bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 3835bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3836bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 3837bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 3838bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3839bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3840bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 3841bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 3842bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 3843bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3844bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 38451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3846462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 38471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 38481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 38491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 38501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 38511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 38521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 38531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 38541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 38551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 38561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 38571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3858462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 38591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 38601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 38611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 38621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 38631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 38641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 38651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 38661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 38671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 38681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 38691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 3870f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 3871f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 3872f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 3873f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 3874f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 3875f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 3876f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3879462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3881f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 3882f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 3883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3884f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 3885f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 3886f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3887f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3889f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 3890f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3891f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3893f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3894f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 389524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3896f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 3897f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 3898f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 3899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3901f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3903f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 3904f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3913462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 391403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 391503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 391603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 391703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 391803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 391903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 392003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 392103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 392203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 392303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 392403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 392503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 39269e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 392703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 392803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 392903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 393003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 393103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 393203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 393303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 393403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 393503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 393603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 393703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 393803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 393903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 394003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 3941f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 3942f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 3943f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 3944f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 3945f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3946f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 3947f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (array) 3948f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return array->getSize().getLimitedValue(); 3949f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 3950f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 3951f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 395203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 395303e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 3954462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 396103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 396203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 396324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 396524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 396624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 396724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 396824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 397124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 397224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 39811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 398724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 399124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 399224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3994462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3995462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 399724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 399824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 400324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypedefDecl *decl = TypedefDecl::Create(*ast_context, 400724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 400824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 400924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 401024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->CreateTypeSourceInfo(qual_type)); 401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypedefType (decl).getAsOpaquePtr(); 401424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 401524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 4020462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4026462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 402824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4029462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefDecl *typedef_decl = typedef_type->getDecl(); 403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 403224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 403624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 403824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 403924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 404124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 4047462d4147f3bb9141bf62d904f58a623db00669dfGreg 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) 404824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 404924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 405024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 405124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 405224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 405324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 405624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 405724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 405824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 406024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 406124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 406224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 406324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 406424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 406524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 406624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 407024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 407424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 407524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 407624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 407724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 407824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 407924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 408024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 408124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 4082462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 408324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 408624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 408724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 408824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 409124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 409224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 409324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 409424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 409624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref); 409724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t bit_size = ast_context->getTypeSize (qual_type); 409924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 410024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 410124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 410224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 410324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 410424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 410524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 410624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 410724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 410824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 410924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 411024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 411124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 411224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 411324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 411424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 411524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 411624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 411724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 411824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4119a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4120a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 4121462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 4122a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 4123a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 4124a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4125a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4126a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4127a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 4128a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 4129