ClangASTContext.cpp revision a91dd997b1e809c67901b7ac481942cacae19150
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)); 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_ast_context_ap.get(); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 341e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 342e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3558a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager * 3568a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager() 3578a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 3588a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_manager_ap.get() == NULL) 3598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan m_file_manager_ap.reset(new clang::FileManager()); 3608a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_manager_ap.get(); 3618a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 3628a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 3638a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileSystemOptions * 3648a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileSystemOptions() 3658a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 3668a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_system_options_ap.get() == NULL) 3678a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan m_file_system_options_ap.reset(new clang::FileSystemOptions()); 3688a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_system_options_ap.get(); 3698a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 3708a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 3711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 3758a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager(), *getFileSystemOptions())); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(new Diagnostic()); 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type); 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 420462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 421585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size); 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 430462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 431462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size) 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ast_context) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 438585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 443585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 458585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 473585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 482585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 490462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context) 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy)) 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->VoidPtrTy.getAsOpaquePtr(); 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy)) 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->BoolTy.getAsOpaquePtr(); 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy)) 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatComplexTy.getAsOpaquePtr(); 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy)) 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleComplexTy.getAsOpaquePtr(); 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy)) 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleComplexTy.getAsOpaquePtr(); 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy)) 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->FloatTy.getAsOpaquePtr(); 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy)) 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->DoubleTy.getAsOpaquePtr(); 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy)) 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongDoubleTy.getAsOpaquePtr(); 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5418ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5438ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 5448ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->LongLongTy.getAsOpaquePtr(); 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5518ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5638ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 5648ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 5658ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 5668ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->IntTy.getAsOpaquePtr(); 5678ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 5688ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->Int128Ty.getAsOpaquePtr(); 5698ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 5708ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (streq(type_name, "wchar_t")) 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy)) 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->WCharTy.getAsOpaquePtr(); 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy)) 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->ShortTy.getAsOpaquePtr(); 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy)) 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->IntTy.getAsOpaquePtr(); 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy)) 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongTy.getAsOpaquePtr(); 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy)) 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->LongLongTy.getAsOpaquePtr(); 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty)) 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->Int128Ty.getAsOpaquePtr(); 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy)) 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->CharTy.getAsOpaquePtr(); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy)) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->SignedCharTy.getAsOpaquePtr(); 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6098ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6118ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 6128ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6148ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6198ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 6308ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 6318ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 6328ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->UnsignedIntTy.getAsOpaquePtr(); 6338ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 6348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 6358ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy)) 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedShortTy.getAsOpaquePtr(); 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy)) 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedIntTy.getAsOpaquePtr(); 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy)) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongTy.getAsOpaquePtr(); 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy)) 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedLongLongTy.getAsOpaquePtr(); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty)) 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedInt128Ty.getAsOpaquePtr(); 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy)) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->UnsignedCharTy.getAsOpaquePtr(); 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 667462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 668462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast_context) 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 670a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return ast_context->VoidTy.getAsOpaquePtr(); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 673462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 674a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool() 675a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{ 676a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan return getASTContext()->BoolTy.getAsOpaquePtr(); 677a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan} 678a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan 679a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t 680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 68204325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinIdTy.getAsOpaquePtr(); 683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 684960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 685462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 686960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 687960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 68804325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 689960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 690960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 691462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 692960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 693960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 69404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinSelTy.getAsOpaquePtr(); 695960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 696960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 697462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 708462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 714462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 715462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType void_ptr_type(ast_context->VoidPtrTy); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 725839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananclass NullDiagnosticClient : public DiagnosticClient 726839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan{ 727839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananpublic: 728839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan NullDiagnosticClient () 729839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan { 730839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 731839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan } 732839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan 733839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 734839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan { 735839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan if (m_log) 736839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan { 737839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 738839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan info.FormatDiagnostic(diag_str); 739839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan diag_str.push_back('\0'); 740839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 741839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan } 742839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan } 743839fde455820d7758685f5eb2257a83e96ca68d2Sean Callananprivate: 744e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP m_log; 745839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan}; 746839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan 747462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 748462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CopyType (ASTContext *dest_context, 749462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *source_context, 750462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 752ad5b61b871bace8dd7b28862662ed7f165d47267Sean Callanan // null_client's ownership is transferred to diagnostics 753839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan NullDiagnosticClient *null_client = new NullDiagnosticClient; 754839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan Diagnostic diagnostics(null_client); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileManager file_manager; 7568a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTImporter importer(diagnostics, 7588a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan *dest_context, file_manager, file_system_options, 7598a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan *source_context, file_manager, file_system_options); 760cf18faaf72090a68480145ca206955d792633559Sean Callanan 761cf18faaf72090a68480145ca206955d792633559Sean Callanan QualType src = QualType::getFromOpaquePtr(clang_type); 762cf18faaf72090a68480145ca206955d792633559Sean Callanan QualType dst = importer.Import(src); 763cf18faaf72090a68480145ca206955d792633559Sean Callanan 764cf18faaf72090a68480145ca206955d792633559Sean Callanan return dst.getAsOpaquePtr(); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7676916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 7686916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl * 7696916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangASTContext::CopyDecl (ASTContext *dest_context, 7706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton ASTContext *source_context, 7716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *source_decl) 7726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 7736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton // null_client's ownership is transferred to diagnostics 7746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton NullDiagnosticClient *null_client = new NullDiagnosticClient; 7756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton Diagnostic diagnostics(null_client); 7766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton FileManager file_manager; 7778a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 7786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton ASTImporter importer(diagnostics, 7798a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan *dest_context, file_manager, file_system_options, 7808a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan *source_context, file_manager, file_system_options); 7816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 7826916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return importer.Import(source_decl); 7836916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 7846916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 7858d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 786462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AreTypesSame(ASTContext *ast_context, 787462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 788462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 7895510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 7905510dddc33260a991284ef81ca343594f23262e8Sean Callanan return ast_context->hasSameType(QualType::getFromOpaquePtr(type1), 7915510dddc33260a991284ef81ca343594f23262e8Sean Callanan QualType::getFromOpaquePtr(type2)); 7925510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 7935510dddc33260a991284ef81ca343594f23262e8Sean Callanan 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 796462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 797462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 808462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 809462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 820462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 821462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 834462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 835585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 83904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 844585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 8459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 846306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 8479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 8489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 8499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 8509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context, 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL); 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(decl).getAsOpaquePtr(); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 865dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 866dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 867dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 868dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 869dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 870dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 871dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (::strstr(name, "operator ") != name) 872dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 873dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 874dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton const char *post_op_name = name + 9; 875dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 876dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 877dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 878dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 879dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 880dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 881dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 882dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 883dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 884dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 885dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 886dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 887dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 888dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 889dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 890dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 891dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 892dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 893dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 894dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 895dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 896dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 897dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 898dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 899dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 900dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 901dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 902dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 903dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 904dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 905dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 906dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 907dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 908dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 909dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 910dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 911dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 912dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 913dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 914dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 915dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 916dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 917dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 918dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 919dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 920dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 921dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 922dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 923dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 924dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 925dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 926dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 927dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 928dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 929dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 930dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 931dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 932dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 933dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 934dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 935dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 936dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 937dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 938dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 939dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 940dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 941dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 942dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 943dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 944dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 945dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 946dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 947dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 948dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 949dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 950dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 951dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 952dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 953dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 954dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 955dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 956dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 957dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 958dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 959dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 960dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 961dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 962dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 963dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 964dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 965dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 966dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 967dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 968dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 969dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 970dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 971dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 972dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 973dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 974dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 975dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 976dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 977dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 978dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 979dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 980dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 981dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 982dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 983dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 984dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 985dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 986dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 987dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 988dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 989dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 990dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 991dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 992dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 993dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 994dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 995dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 996dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 997dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 998dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 999dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1000dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1001dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 1002dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1003dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 1004dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1005dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1006dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1007dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1008dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 1009dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 1010dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1011dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1012dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1013dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1014dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 1015dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 1016dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1017dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1018dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1019dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 1020dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1021dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 1022dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1023dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1024dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1025dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1026dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 1027dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 1028dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1029dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1030dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 1031dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 1032dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1033dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1034dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1035dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1036dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1037dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1038dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1039dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1040dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1041dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1042dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1043dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1044dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1045dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1046dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1047dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1048dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1049dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1050dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1051dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1052dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1053dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1054dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1055dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1056412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1057795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1058795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1059462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1060462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1061412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1062462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1063412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 10641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 10651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 106630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 106730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1068412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1069795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1071974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1072795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1073795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(ast_context); 1074795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1075795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 1076795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1077795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1078795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 10801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 10811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *clang_type(record_qual_type.getTypePtr()); 1082795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type == NULL) 1084412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1085795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordType *record_clang_type(dyn_cast<RecordType>(clang_type)); 1087795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_clang_type == NULL) 1089412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1090795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton RecordDecl *record_decl = record_clang_type->getDecl(); 1092795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (record_decl == NULL) 1094412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1095795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1096795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 1097795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 10981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1099412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1100795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 11011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 11021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 110330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 110530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 110690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 110790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 110890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 11095325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 111090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 11115325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 111290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 111390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 11145325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 111530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 111690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 111790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 111890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 111990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 112090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 112190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 112290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 112390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast_context, 112490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 11255325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 112690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 11278950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, 112890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 112990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 113090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 113190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton else if (decl_name == record_decl->getDeclName()) 113230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 113330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast_context, 113430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 11355325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()), 113630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 113730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 113830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 113930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 114030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 114130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 114230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 114390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1144dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1145dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1146dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 114790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1148dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1149dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 115190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1152dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 115390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 115490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1155dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1156dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1157dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline); 1158dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast_context, 1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 11645325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1165dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1166dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1167dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1168dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_explicit); 1169dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 117090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1171dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1172dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 117390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 117490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast_context, 117590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 117790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 117890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 117990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 118090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 118190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline); 118290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 118330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1185462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 118647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 11871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 11881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 118947a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 11903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 11913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 11933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 11953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 11963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 11973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 11981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params[param_index] = ParmVarDecl::Create (*ast_context, 11991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 12001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 12011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 12021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 12031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 12041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 12051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 12061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 12073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 12103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 1212795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1213412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1214795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1215795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1216795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 121784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 121884f8075072eef306234f8109573067647735c111Greg Clayton( 1219462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1220462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 122184f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1222462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 122384f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 122484f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 122584f8075072eef306234f8109573067647735c111Greg Clayton) 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 125047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125284f8075072eef306234f8109573067647735c111Greg Clayton FieldDecl *field = FieldDecl::Create (*ast_context, 125384f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 125484f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 125584f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 125684f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 125784f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 125884f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 125984f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126184f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 12699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 12719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 12729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 12731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 127460a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan ClangASTContext::AddObjCClassIVar (ast_context, 127560a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 12769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 12779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 12789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 12799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 12801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 12819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 12829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ast_context == NULL || field == NULL) 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context)) 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1347462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type) 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 13521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = qual_type.getTypePtr(); 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl) 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx; 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++field_idx) 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If no accessibility was assigned, assign the correct one 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field->setAccess ((AccessSpecifier)default_accessibility); 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 137624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 137824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1380462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 13836e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 13846e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 13856e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 13866e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 13876e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type))); 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1391e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1392e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1393e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1394e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1395e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1396e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1397e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1398e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1399e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1400e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1402462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr(); 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 140824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 140924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordType *record_type = dyn_cast<RecordType>(clang_type); 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl()); 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cxx_record_decl->setBases(base_classes, num_base_classes); 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 142384f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 142484f8075072eef306234f8109573067647735c111Greg Clayton 1425462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 142684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 142784f8075072eef306234f8109573067647735c111Greg Clayton( 142884f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 142984f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 143084f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 143184f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 143284f8075072eef306234f8109573067647735c111Greg Clayton) 143384f8075072eef306234f8109573067647735c111Greg Clayton{ 143484f8075072eef306234f8109573067647735c111Greg Clayton ASTContext *ast_context = getASTContext(); 143584f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 143684f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 143784f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 143884f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx = ast_context->getTranslationUnitDecl(); 143984f8075072eef306234f8109573067647735c111Greg Clayton 144084f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 144184f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 144284f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 144384f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 144484f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 144584f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context, 144684f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 144784f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 144884f8075072eef306234f8109573067647735c111Greg Clayton &ast_context->Idents.get(name), 144984f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 145084f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 145184f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 14529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 14539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr(); 145484f8075072eef306234f8109573067647735c111Greg Clayton} 145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 145684f8075072eef306234f8109573067647735c111Greg Claytonbool 1457462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 145884f8075072eef306234f8109573067647735c111Greg Clayton{ 145984f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 146084f8075072eef306234f8109573067647735c111Greg Clayton { 146184f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 146284f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 146384f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 146484f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 146584f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 146684f8075072eef306234f8109573067647735c111Greg Clayton { 146784f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 146884f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 146984f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 147084f8075072eef306234f8109573067647735c111Greg Clayton { 147184f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 147284f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 147384f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 147484f8075072eef306234f8109573067647735c111Greg Clayton { 147584f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 147684f8075072eef306234f8109573067647735c111Greg Clayton return true; 147784f8075072eef306234f8109573067647735c111Greg Clayton } 147884f8075072eef306234f8109573067647735c111Greg Clayton } 147984f8075072eef306234f8109573067647735c111Greg Clayton } 148084f8075072eef306234f8109573067647735c111Greg Clayton } 148184f8075072eef306234f8109573067647735c111Greg Clayton return false; 148284f8075072eef306234f8109573067647735c111Greg Clayton} 148384f8075072eef306234f8109573067647735c111Greg Clayton 148484f8075072eef306234f8109573067647735c111Greg Clayton 148584f8075072eef306234f8109573067647735c111Greg Claytonbool 148684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 148784f8075072eef306234f8109573067647735c111Greg Clayton( 1488462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1489462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 149084f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1491462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 149284f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 149384f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 14941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 149584f8075072eef306234f8109573067647735c111Greg Clayton) 149684f8075072eef306234f8109573067647735c111Greg Clayton{ 149784f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 149884f8075072eef306234f8109573067647735c111Greg Clayton return false; 149984f8075072eef306234f8109573067647735c111Greg Clayton 150060a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan IdentifierTable *identifier_table = &ast_context->Idents; 150184f8075072eef306234f8109573067647735c111Greg Clayton 150284f8075072eef306234f8109573067647735c111Greg Clayton assert (ast_context != NULL); 150384f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 150484f8075072eef306234f8109573067647735c111Greg Clayton 150584f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 150684f8075072eef306234f8109573067647735c111Greg Clayton 150784f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 150884f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 150984f8075072eef306234f8109573067647735c111Greg Clayton { 151084f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 151184f8075072eef306234f8109573067647735c111Greg Clayton 151284f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 151384f8075072eef306234f8109573067647735c111Greg Clayton { 151484f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 151584f8075072eef306234f8109573067647735c111Greg Clayton 151684f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 151784f8075072eef306234f8109573067647735c111Greg Clayton { 151884f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 151984f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 152084f8075072eef306234f8109573067647735c111Greg Clayton { 152184f8075072eef306234f8109573067647735c111Greg Clayton APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size); 152247a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation()); 152384f8075072eef306234f8109573067647735c111Greg Clayton } 152484f8075072eef306234f8109573067647735c111Greg Clayton 15259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context, 15269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 15279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 15309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 15349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 154084f8075072eef306234f8109573067647735c111Greg Clayton } 154184f8075072eef306234f8109573067647735c111Greg Clayton } 154284f8075072eef306234f8109573067647735c111Greg Clayton } 154384f8075072eef306234f8109573067647735c111Greg Clayton return false; 154484f8075072eef306234f8109573067647735c111Greg Clayton} 154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15479488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1548462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 15499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 15509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 15519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 15539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 15549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 15569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 15589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 15599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 15619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 15629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15639488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 15649488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 15659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 15669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 15679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 15699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 15709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 15719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 15729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 15781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1579462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 15801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 15811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1582462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton ASTContext *ast_context, 1583462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 15841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1585462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 15861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 15871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 15881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 15891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 15901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 15911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton IdentifierTable *identifier_table = &ast_context->Idents; 15931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (ast_context != NULL); 15951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 15961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 15981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 15991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 16001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 16011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 16041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 16061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 16091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 16111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 16141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 16151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 16181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 16191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 16211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1622ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1624ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1625ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1626ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1627ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 16281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1629ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 16301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1631ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 16326bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 16336bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1634ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 16351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 16366bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 16376bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 16381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 16391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 16421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 16431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1644ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 16451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 16461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 16481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 16501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *method_type(method_qual_type.getTypePtr()); 16511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 16531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 16561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 16581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 16621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 16631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 16641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 16651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 16671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context, 16691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 16701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 16711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 16721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 16731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 16741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 16751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 16761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 16771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 16781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 16791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 16801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 16811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 16841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 16851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 16871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 16881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 16891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 16901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 16911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 16921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton params.push_back (ParmVarDecl::Create (*ast_context, 16931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 16941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 16951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 16961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 16971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 16981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 16991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 17001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 17011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 17021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args); 17041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 17059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 17071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 17101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 17111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 17121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1713bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 1714f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 1715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 1716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 1717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang::ASTContext *ast_context, 1718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 1719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 1720bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 1721bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 1722f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 1723f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1724f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1725f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 1726bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1727bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1728bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1729bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1730bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 1731bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 173204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 173304325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 173404325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 173504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 173604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 1737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (ast_context && pointee_or_element_clang_type) 1738f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 173904325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 1740f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 1742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 174304325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 174404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 1745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 1747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 1750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1751bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Complex: return eTypeHasChildren | eTypeIsBuiltIn | eTypeHasValue; 1752f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 1754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 1755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 1756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 1757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 1759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 1760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1761bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 1762bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 1763bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 1764bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 1765f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1766f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 1767f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1768f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 1769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 1770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1771bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 1772bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 1773bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 1774bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 1775bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 1776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1777f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 1778f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 1779f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1780f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 1781f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 1782f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1783bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 1784f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1785f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 1786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 1789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 1791bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 1792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 1794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 1797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1798bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 1799bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 1800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 1801bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 1802bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 1803bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 1804bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 1805bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 1806bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 1807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 1809f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 1810f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ast_context, 1811f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 1812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1813bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 1814bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 1815bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 1816bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 1817bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 1818bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 1819bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 1820bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 1821bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1826462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 182724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 183024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 183403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 18371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 18381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 18391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 18401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 18411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 18429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 18439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 184424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 184824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 184924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 185024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 185524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 1857462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes) 185824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_qual_type == NULL) 186024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 186124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 186224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 186324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type)); 18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 18659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1867960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 1868960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 1869960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1870f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 1871960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 1872960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1873f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1874960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 1875960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 1876960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1877960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1878960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 1879960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 18801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 188153d287bda5182511685a1dc7961a54b30bf3eedcGreg Clayton if (ClangASTType::IsDefined (clang_qual_type)) 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 189624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 19239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 19249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 19269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 19279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 19289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 19309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 19329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 19359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 19369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 19389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 19409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 19419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 19439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 19449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 19479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 1953960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 1954960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 1955960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 1956960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1957960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 1958960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 1959960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 1960960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 1961960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 1962960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 1963960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 1964960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 19659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 19749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 19759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If this type points to a simple type, then it has 1 child 197724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = 1; 197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1984f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 1985f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 1986f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 1987f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 1988f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 1989f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), 1990f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 1991f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 1992f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 1993f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 1994f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 1995f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 1996f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 1997f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 1998f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1999f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 20001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 200124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes); 200224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2011462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 201224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2015462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2023bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 2024bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool &child_is_base_class 202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 203824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2039bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2040bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 204124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 204224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2044462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2049462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2057bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 2058bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton bool &child_is_base_class 205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 206424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes)) 206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2069bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 207103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 207203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2074960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2075960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2076960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2077960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2078960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 207904325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 208004325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_byte_size = ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / CHAR_BIT; 2081960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr(); 2082960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2083960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2084960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2085960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2086960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2087960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2088960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 20891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl); 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 21238a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity(); 212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 21258a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity(); 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 212924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 213024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 213124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType()); 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType()); 216154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size)) 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 21829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 21839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 21859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 21869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 21889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl); 21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 21929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 21939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 21959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2196960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 21979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl)); 22019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 22049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 22069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2208960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2209bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 22109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 22159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 22189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2220960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2221960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 22229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 22249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 22269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 22289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 22309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 22329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 22349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 22369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr()); 22389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 22409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 2242960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 22439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 22449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 22469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 22489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 22569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2257960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2258960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2259960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2260960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2261960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2262960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return GetChildClangTypeAtIndex (ast_context, 2263960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2264960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2265960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2266960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2267960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2268960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2269960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2270960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2271960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2272bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2273bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 2274960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2275960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2276960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2277960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2278960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2279960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2280960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2281960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2282960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2283960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2284960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2285960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2286960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2287960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2288960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2289960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2290960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2291960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2292960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 22939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2305bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton char element_name[64]; 2306bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(element_name); 230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(field_type_info.first % 8 == 0); 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = idx * child_byte_size; 231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return array->getElementType().getAsOpaquePtr(); 231324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 231524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 232724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 232924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 233024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 233124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 233224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2334bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2335bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 233624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 233824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 233924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 234024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 234124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 234224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2358f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2359f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2360f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2361f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2362f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2363f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2364f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2365f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2366f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return GetChildClangTypeAtIndex (ast_context, 2367f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2368f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2369f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2370f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2371f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 2372f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2373f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2374f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2375f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2376f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 2377f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_is_base_class); 2378f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2379f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2380f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2381f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2382f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2383f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2384f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2385f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2386f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2387f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2388f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2389f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2390f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 2391f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2392f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2393f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2394f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2395f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2396f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2397f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2398f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2399f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 24001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (ast_context, 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 2412bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class); 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2419f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false; 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 243124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 243224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 243324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 243724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 244024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 244224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 253324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 257424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 257524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 257924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2600462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 260324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 260424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 260903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 261003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 262024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 262124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 262224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 262324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 262424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 262524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 262624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 262724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 262824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 263024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 263224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 263324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 263424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 263724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name)); 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 264724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 267524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 27009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 27019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 27039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 27049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 27059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 27069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2715823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 27209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 27229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 27239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 27249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 27269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 27279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 27319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 27339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 27349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 27359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 27369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (GetIndexOfChildMemberWithName (ast_context, 27389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 27399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 27409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 27419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 27429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 27449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 27459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 27469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 27499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 27509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 27519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 27529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 27599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 27609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildMemberWithName (ast_context, 27619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 27629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 27639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 27649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 27659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 277824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 280124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 28041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 28051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildMemberWithName (ast_context, 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context, 2878462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 28869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 288703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 28889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 288903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 29349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 29359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 29379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 29389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 29399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 29409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 29429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 29439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 29459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 29479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 29489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 29509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 29529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 29549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 29569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 29579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 29589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 29609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 29649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 29669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 29679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 29729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 29749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 29759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return GetIndexOfChildWithName (ast_context, 29769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 29779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 29789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 29799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 29809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 29819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 29821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType()); 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return GetIndexOfChildWithName (ast_context, 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 30171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 30181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type); 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetIndexOfChildWithName (ast_context, 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3082462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 30871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3109462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 311503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 311603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 31209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 31219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 31229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 31239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 31249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 31259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 31269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 31279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 31289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 31299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 31309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 31319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 31329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 31339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 31349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 31359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 31369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 31379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 31389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 31409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 31419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 31429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 31439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name)); 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3170462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (&ast_context->Idents.get(name)), 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FunctionDecl::Create(*ast_context, 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3205462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3206462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast_context, 3207462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3208462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 32092ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 32102ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 32112ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type), 322053d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 32222ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan is_variadic, 32232ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan type_quals, 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasExceptionSpec 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, // hasAnyExceptionSpec, 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // NumExs 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // const QualType *ExArray 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn); 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3232462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ParmVarDecl::Create(*ast_context, 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->getTranslationUnitDecl(), 323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name && name[0] ? &ast_context->Idents.get(name) : NULL, 32402ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3257462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3258462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3277462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 32821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3301462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 330655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 330755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 330855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 330955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 331155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 331255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 331355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 331455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 331555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 331604325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 331704325065a00f646527db85e9bc751da29ac53b23Sean Callanan 331804325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 331904325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 332004325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 332104325065a00f646527db85e9bc751da29ac53b23Sean Callanan 332204325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 332304325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 332404325065a00f646527db85e9bc751da29ac53b23Sean Callanan 332555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 332655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 332755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 332855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 332955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 333055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 333155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 333355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 333455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 333555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 333655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 333755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 333848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton ASTContext *ast_context = getASTContext(); 333948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 334048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 334148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 334248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 334348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (ast_context->getTypeSize(enum_decl->getIntegerType()) < ast_context->getTypeSize(ast_context->IntTy)) 334448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 334548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 334648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = ast_context->IntTy; 334748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 334848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = ast_context->UnsignedIntTy; 334948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 335048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 335148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 335248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 335348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 335455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3364462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3365462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name, clang_type_t integer_qual_type) 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 337148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 337248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 337348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 337448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 337548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 337648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast_context, 337748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton ast_context->getTranslationUnitDecl(), 337848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 337948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton name && name[0] ? &ast_context->Idents.get(name) : NULL, 338048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 33818950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, false, false); //IsScoped, IsFixed); 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3383e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3384e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3385e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr(); 3387e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3391462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3392462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3393462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3394462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3395462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3396462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 3397462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3398462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3399462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3400462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3401462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3402462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3403462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3404462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3405462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3406462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3407462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3408462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3412462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3413462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 343624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl::Create(*ast_context, 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl(), 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(enumerator_clang_type), 344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint); 344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3462462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3463462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 34667b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 34677b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 34687b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 346903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 347003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 34717b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 34727b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 34737b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 34747b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 34757b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 34767b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 34777b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton return getASTContext()->getPointerType(qual_type).getAsOpaquePtr(); 34787b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 34797b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3483462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3484462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateLValueReferenceType (clang_type_t clang_type) 348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3491462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3492462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateRValueReferenceType (clang_type_t clang_type) 349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 349524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3499462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3500462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3501fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3502fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3503fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3504fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3505fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3506fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3507fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 350924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypeSize(ast_context->VoidPtrTy); 351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3516462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 352203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 352303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 352504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 352604325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 352704325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 352804325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 352904325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 353004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 353104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 353204325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 353304325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 353404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 35351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 35591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 356024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3568462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3588462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 359303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 359403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 359604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 359704325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 359804325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 359904325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 360004325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 360104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 360204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 360304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 360404325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 360504325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 36061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 360724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 360824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 361624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type); 362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3632462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 364024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 364424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 364524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3670bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3671bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 3672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 3673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 3674bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 3675bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3677bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3678bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 3679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 3680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 3681bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 3682bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 3683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 3685bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 3686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 3687bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 3688bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 3689bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 36901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3691462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 36921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 36931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 36941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 36951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 36961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 36971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 36981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 36991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 37001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 37011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 37021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 3703462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 37041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 37051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 37061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 37071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 37081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 37091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 37101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 37111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 37121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 37131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 37141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 3715f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 3716f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 3717f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 3718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 3719f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 3720f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 3721f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3724462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3726f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 3727f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 3728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3729f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 3730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 3731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 3735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 3736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3738f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3739f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 3742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 3743f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 3744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 374724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 3749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 375024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 375124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 375224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 375324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 375624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 375724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3758462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 375903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 376003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 376103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 376203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 376303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 376403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 376503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 376603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 376703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 376803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 376903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 377003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 377103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr()); 377203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 377303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 377403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 377503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 377603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 377703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 377803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 377903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 378003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 378103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 378203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 378303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 378403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 378503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 3786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 3787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 3788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 3789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 3790f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 3791f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 3792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (array) 3793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return array->getSize().getLimitedValue(); 3794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 3795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 3796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 379703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 379803e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 3799462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 380703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 38151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 382024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 38211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 382324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 38261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 382724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 383024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 383524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 383824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3839462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3840462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 384224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ASTContext *ast_context = getASTContext(); 384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (ast_context != NULL); 384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx = ast_context->getTranslationUnitDecl(); 385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypedefDecl *decl = TypedefDecl::Create(*ast_context, 385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 385424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name ? &identifier_table->get(name) : NULL, // Identifier 385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ast_context->CreateTypeSourceInfo(qual_type)); 385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 385824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ast_context->getTypedefType (decl).getAsOpaquePtr(); 385924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 386024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 386124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 386224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 386424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 3865462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3869462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3871462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3874462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefDecl *typedef_decl = typedef_type->getDecl(); 387524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 387624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 387924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 388124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 388624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 388724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 389024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 3892462d4147f3bb9141bf62d904f58a623db00669dfGreg 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) 389324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 389424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 389524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 389624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 389724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 389824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 389924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 390324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 391724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 391824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 391924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 392024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 392124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 392224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 392324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 392424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 392624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 3927462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 392824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 392924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 393024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 393124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 393224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 393324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 393424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 393524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 393624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 393724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 393824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref); 394224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 394324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t bit_size = ast_context->getTypeSize (qual_type); 394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 394724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 394924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 395024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 395124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 395224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 396124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 396324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3964a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3965a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 3966462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 3967a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 3968a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 3969a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3970a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3971a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 3972a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 3973a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 3974