ClangASTContext.cpp revision a4881d04b4f367c67e34e8040e1257fc222a8b41
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 17b01000fd063629facd45044f137446fb748ee179Greg Clayton 18b01000fd063629facd45044f137446fb748ee179Greg Clayton// Clang headers like to use NDEBUG inside of them to enable/disable debug 19b01000fd063629facd45044f137446fb748ee179Greg Clayton// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing 20b01000fd063629facd45044f137446fb748ee179Greg Clayton// or another. This is bad because it means that if clang was built in release 21b01000fd063629facd45044f137446fb748ee179Greg Clayton// mode, it assumes that you are building in release mode which is not always 22b01000fd063629facd45044f137446fb748ee179Greg Clayton// the case. You can end up with functions that are defined as empty in header 23b01000fd063629facd45044f137446fb748ee179Greg Clayton// files when NDEBUG is not defined, and this can cause link errors with the 24b01000fd063629facd45044f137446fb748ee179Greg Clayton// clang .a files that you have since you might be missing functions in the .a 25b01000fd063629facd45044f137446fb748ee179Greg Clayton// file. So we have to define NDEBUG when including clang headers to avoid any 26b01000fd063629facd45044f137446fb748ee179Greg Clayton// mismatches. This is covered by rdar://problem/8691220 27b01000fd063629facd45044f137446fb748ee179Greg Clayton 28b01000fd063629facd45044f137446fb748ee179Greg Clayton#ifndef NDEBUG 29b01000fd063629facd45044f137446fb748ee179Greg Clayton#define LLDB_DEFINED_NDEBUG_FOR_CLANG 30bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#define NDEBUG 31b01000fd063629facd45044f137446fb748ee179Greg Clayton// Need to include assert.h so it is as clang would expect it to be (disabled) 32b01000fd063629facd45044f137446fb748ee179Greg Clayton#include <assert.h> 33b01000fd063629facd45044f137446fb748ee179Greg Clayton#endif 34b01000fd063629facd45044f137446fb748ee179Greg Clayton 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTImporter.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/CXXInheritance.h" 3884f8075072eef306234f8109573067647735c111Greg Clayton#include "clang/AST/DeclObjC.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h" 438a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan#include "clang/Basic/FileSystemOptions.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h" 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h" 49b01000fd063629facd45044f137446fb748ee179Greg Clayton 50b01000fd063629facd45044f137446fb748ee179Greg Clayton#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG 51bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG 52b01000fd063629facd45044f137446fb748ee179Greg Clayton#undef LLDB_DEFINED_NDEBUG_FOR_CLANG 53b01000fd063629facd45044f137446fb748ee179Greg Clayton// Need to re-include assert.h so it is as _we_ would expect it to be (enabled) 54b01000fd063629facd45044f137446fb748ee179Greg Clayton#include <assert.h> 55b01000fd063629facd45044f137446fb748ee179Greg Clayton#endif 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h" 58f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h" 59839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h" 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h> 62f05633b35544b5d095feb05680c8728be087e441Eli Friedman 63585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb; 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68b01000fd063629facd45044f137446fb748ee179Greg Clayton 69b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic bool 70b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type) 71b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 72b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 73b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 74b01000fd063629facd45044f137446fb748ee179Greg Clayton { 75b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 76b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 77b01000fd063629facd45044f137446fb748ee179Greg Clayton { 78b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr()); 79b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_type) 80b01000fd063629facd45044f137446fb748ee179Greg Clayton { 81b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::TagDecl *tag_decl = tag_type->getDecl(); 82b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl) 83b01000fd063629facd45044f137446fb748ee179Greg Clayton { 84b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl->getDefinition()) 85b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 86b01000fd063629facd45044f137446fb748ee179Greg Clayton 87b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl->hasExternalLexicalStorage()) 88b01000fd063629facd45044f137446fb748ee179Greg Clayton { 89b01000fd063629facd45044f137446fb748ee179Greg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 90b01000fd063629facd45044f137446fb748ee179Greg Clayton if (external_ast_source) 91b01000fd063629facd45044f137446fb748ee179Greg Clayton { 92b01000fd063629facd45044f137446fb748ee179Greg Clayton external_ast_source->CompleteType(tag_decl); 93b01000fd063629facd45044f137446fb748ee179Greg Clayton return !tag_type->isIncompleteType(); 94b01000fd063629facd45044f137446fb748ee179Greg Clayton } 95b01000fd063629facd45044f137446fb748ee179Greg Clayton } 96b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 97b01000fd063629facd45044f137446fb748ee179Greg Clayton } 98b01000fd063629facd45044f137446fb748ee179Greg Clayton } 99b01000fd063629facd45044f137446fb748ee179Greg Clayton 100b01000fd063629facd45044f137446fb748ee179Greg Clayton } 101b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 102b01000fd063629facd45044f137446fb748ee179Greg Clayton 103b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 104b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 105b01000fd063629facd45044f137446fb748ee179Greg Clayton { 106b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type); 107b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 108b01000fd063629facd45044f137446fb748ee179Greg Clayton { 109b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 110b01000fd063629facd45044f137446fb748ee179Greg Clayton // We currently can't complete objective C types through the newly added ASTContext 111b01000fd063629facd45044f137446fb748ee179Greg Clayton // because it only supports TagDecl objects right now... 112b01000fd063629facd45044f137446fb748ee179Greg Clayton bool is_forward_decl = class_interface_decl->isForwardDecl(); 113b01000fd063629facd45044f137446fb748ee179Greg Clayton if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage()) 114b01000fd063629facd45044f137446fb748ee179Greg Clayton { 115b01000fd063629facd45044f137446fb748ee179Greg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 116b01000fd063629facd45044f137446fb748ee179Greg Clayton if (external_ast_source) 117b01000fd063629facd45044f137446fb748ee179Greg Clayton { 118b01000fd063629facd45044f137446fb748ee179Greg Clayton external_ast_source->CompleteType (class_interface_decl); 119b01000fd063629facd45044f137446fb748ee179Greg Clayton is_forward_decl = class_interface_decl->isForwardDecl(); 120b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1217a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return is_forward_decl == false; 122b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1237a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return true; 124b01000fd063629facd45044f137446fb748ee179Greg Clayton } 125b01000fd063629facd45044f137446fb748ee179Greg Clayton } 126b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 127b01000fd063629facd45044f137446fb748ee179Greg Clayton 128b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 129b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()); 130b01000fd063629facd45044f137446fb748ee179Greg Clayton 131b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 132b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 133b01000fd063629facd45044f137446fb748ee179Greg Clayton } 134b01000fd063629facd45044f137446fb748ee179Greg Clayton 135b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 136b01000fd063629facd45044f137446fb748ee179Greg Clayton} 137b01000fd063629facd45044f137446fb748ee179Greg Clayton 138b01000fd063629facd45044f137446fb748ee179Greg Clayton 13984f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 140585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 14184f8075072eef306234f8109573067647735c111Greg Clayton{ 14284f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 14384f8075072eef306234f8109573067647735c111Greg Clayton { 144585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 145585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 146585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 147585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 148585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 14984f8075072eef306234f8109573067647735c111Greg Clayton } 15084f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 15184f8075072eef306234f8109573067647735c111Greg Clayton} 15284f8075072eef306234f8109573067647735c111Greg Clayton 15384f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 154585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 15584f8075072eef306234f8109573067647735c111Greg Clayton{ 15684f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 15784f8075072eef306234f8109573067647735c111Greg Clayton { 158585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 159585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 160585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 161585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 162585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 163585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 16484f8075072eef306234f8109573067647735c111Greg Clayton } 16584f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 16684f8075072eef306234f8109573067647735c111Greg Clayton} 16784f8075072eef306234f8109573067647735c111Greg Clayton 16884f8075072eef306234f8109573067647735c111Greg Clayton 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 173e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 181e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 183e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 184e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 185e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 186e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 195e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 196e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 197b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (!"Invalid input kind!"); 198e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 201e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 202e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 203e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 204e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 205e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 208e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 209e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 210e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 211e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 2598950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan Opts.setVisibilityMode(DefaultVisibility); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 333e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 334b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) : 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 336b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap(), 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 344b01000fd063629facd45044f137446fb748ee179Greg Clayton m_builtins_ap(), 345b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_tag_decl (NULL), 346b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_objc_decl (NULL), 347b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_baton (NULL) 348b01000fd063629facd45044f137446fb748ee179Greg Clayton 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 367b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 374b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 399b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource () 400b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 401b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 402b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 403b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getExternalSource () != NULL; 404b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 405b01000fd063629facd45044f137446fb748ee179Greg Clayton} 406b01000fd063629facd45044f137446fb748ee179Greg Clayton 407b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 408b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap) 409b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 410b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 411b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 412b01000fd063629facd45044f137446fb748ee179Greg Clayton { 413b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (ast_source_ap); 414b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true); 415b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true); 416b01000fd063629facd45044f137446fb748ee179Greg Clayton } 417b01000fd063629facd45044f137446fb748ee179Greg Clayton} 418b01000fd063629facd45044f137446fb748ee179Greg Clayton 419b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 420b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource () 421b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 422b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 423b01000fd063629facd45044f137446fb748ee179Greg Clayton 424b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 425b01000fd063629facd45044f137446fb748ee179Greg Clayton { 426b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap; 427b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (empty_ast_source_ap); 428b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false); 429b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false); 430b01000fd063629facd45044f137446fb748ee179Greg Clayton } 431b01000fd063629facd45044f137446fb748ee179Greg Clayton} 432b01000fd063629facd45044f137446fb748ee179Greg Clayton 433b01000fd063629facd45044f137446fb748ee179Greg Clayton 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 438b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get() == NULL) 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 440b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(new ASTContext (*getLanguageOptions(), 441b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSourceManager(), 442b01000fd063629facd45044f137446fb748ee179Greg Clayton *getTargetInfo(), 443b01000fd063629facd45044f137446fb748ee179Greg Clayton *getIdentifierTable(), 444b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSelectorTable(), 445b01000fd063629facd45044f137446fb748ee179Greg Clayton *getBuiltinContext(), 446b01000fd063629facd45044f137446fb748ee179Greg Clayton 0)); 447887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 448b01000fd063629facd45044f137446fb748ee179Greg Clayton if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton) 449b01000fd063629facd45044f137446fb748ee179Greg Clayton { 450b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage(); 451b01000fd063629facd45044f137446fb748ee179Greg Clayton //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage(); 452b01000fd063629facd45044f137446fb748ee179Greg Clayton } 453b01000fd063629facd45044f137446fb748ee179Greg Clayton 454b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false); 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 456b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap.get(); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 481e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 482e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4958a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager * 4968a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager() 4978a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 4988a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_manager_ap.get() == NULL) 49922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton { 50022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton clang::FileSystemOptions file_system_options; 50122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_file_manager_ap.reset(new clang::FileManager(file_system_options)); 50222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton } 5038a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_manager_ap.get(); 5048a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 5058a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 5061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 51022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager())); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 518eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton { 519eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs()); 520eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton m_diagnostic_ap.reset(new Diagnostic(diag_id_sp)); 521eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton } 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 525887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient 526887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 527887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic: 528887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan NullDiagnosticClient () 529887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 530887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 531887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 532887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 533887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 534887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 535887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_log) 536887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 537887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 538887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan info.FormatDiagnostic(diag_str); 539887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan diag_str.push_back('\0'); 540887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 541887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 542887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 543887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate: 544887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan LogSP m_log; 545887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}; 546887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 547887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient * 548887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient() 549887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 550887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_diagnostic_client_ap.get() == NULL) 551887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_diagnostic_client_ap.reset(new NullDiagnosticClient); 552887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 553887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan return m_diagnostic_client_ap.get(); 554887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan} 555887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 581b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type) 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 583b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t qual_type_bit_size = ast->getTypeSize(qual_type); 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 589462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 590585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 592b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 594b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 596b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size); 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 599462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 600b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size) 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 602b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 607585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 608b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 609b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 612585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 613b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 614b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 615b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 616b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 617b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 618b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 619b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 620b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 621b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 622b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 623b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 624b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 627585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 628b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 629b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 630b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 631b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 632b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 633b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 634b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 635b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 636b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 637b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 638b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 639b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 642585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 643b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 644b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 645b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 646b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 647b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 648b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 651585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 659462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 662b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 665b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 666b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 674b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 675b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 679b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy)) 680b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->BoolTy.getAsOpaquePtr(); 681b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 682b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 683b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 684b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 685b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 686b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 689e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case DW_ATE_lo_user: 690e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton // This has been seen to mean DW_AT_complex_integer 691e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton if (strcmp(type_name, "complex") == 0) 692e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 693e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2); 694b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr(); 695e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 696e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton break; 697e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 699b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy)) 700b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatComplexTy.getAsOpaquePtr(); 701b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy)) 702b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleComplexTy.getAsOpaquePtr(); 703b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy)) 704b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleComplexTy.getAsOpaquePtr(); 705e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else 706e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 707e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2); 708b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr(); 709e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 713b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 714b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 715b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 716b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 717b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 718b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 726b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 727b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 731b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 732b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 736b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 737b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7398ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 741b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 742b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 743b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 744b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 7478ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 748b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 749b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 750b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 751b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 7528ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 7538ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (streq(type_name, "wchar_t")) 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 755b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy)) 756b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->WCharTy.getAsOpaquePtr(); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 760b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 761b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 762b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 763b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 764b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 765b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 766b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 767b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 768b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 769b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 770b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 771b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 779b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 780b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 783b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 784b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 785b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 786b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7928ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 794b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 795b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7978ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 799b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 800b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8028ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 804b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 805b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8078ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 809b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 810b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8128ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 8138ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 814b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 815b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 816b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 817b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 8188ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 821b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 822b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 823b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 824b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 825b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 826b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 827b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 828b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 829b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 830b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 831b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 832b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 836b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 837b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 850462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 851b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast) 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 853b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidTy.getAsOpaquePtr(); 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 856462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 857a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool() 858a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{ 859a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan return getASTContext()->BoolTy.getAsOpaquePtr(); 860a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan} 861a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan 862a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t 863960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 864960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 865c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr(); 866960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 867960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 868462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 869960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 870960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 87104325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 872960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 873960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 874462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 875960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 876960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 877c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr(); 878960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 879960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 880462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 891462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 897462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 898b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const) 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 900b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType void_ptr_type(ast->VoidPtrTy); 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 908462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 90922defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast, 91022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 911462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9138a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 91422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 91522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 916ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 917ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 918cf18faaf72090a68480145ca206955d792633559Sean Callanan 91922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType src (QualType::getFromOpaquePtr(clang_type)); 92022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType dst (importer.Import(src)); 921cf18faaf72090a68480145ca206955d792633559Sean Callanan 922cf18faaf72090a68480145ca206955d792633559Sean Callanan return dst.getAsOpaquePtr(); 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9256916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9266916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl * 92722defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast, 92822defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 9296916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *source_decl) 930887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 9318a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 93222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 93322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 934ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 935ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 9366916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return importer.Import(source_decl); 9386916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 9396916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9408d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 941b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast, 942462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 943462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 9445510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 945b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->hasSameType(QualType::getFromOpaquePtr(type1), 9465510dddc33260a991284ef81ca343594f23262e8Sean Callanan QualType::getFromOpaquePtr(type2)); 9475510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 9485510dddc33260a991284ef81ca343594f23262e8Sean Callanan 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 951462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 952462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 963462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 964462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 975462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 976462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 987b01000fd063629facd45044f137446fb748ee179Greg Clayton 988b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 989b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl) 990b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 991b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 992b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 993b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 994b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 995b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr(); 996b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 997b01000fd063629facd45044f137446fb748ee179Greg Clayton} 998b01000fd063629facd45044f137446fb748ee179Greg Clayton 999b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1000b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl) 1001b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1002b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1003b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1004b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1005b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1006b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr(); 1007b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1008b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1009b01000fd063629facd45044f137446fb748ee179Greg Clayton 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1012462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1013585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1015b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1016b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 101704325065a00f646527db85e9bc751da29ac53b23Sean Callanan 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 1019b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1022585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 10239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1024306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 10259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 10269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 10279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 10289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 1034b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *decl = CXXRecordDecl::Create(*ast, 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 1038b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL); 1039b01000fd063629facd45044f137446fb748ee179Greg Clayton 1040b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(decl).getAsOpaquePtr(); 1041b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1042b01000fd063629facd45044f137446fb748ee179Greg Clayton 1043b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 1044b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern) 1045b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1046b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 1047b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 1048b01000fd063629facd45044f137446fb748ee179Greg Clayton 1049b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1050b01000fd063629facd45044f137446fb748ee179Greg Clayton 1051b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1052b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 1053b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1054b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 1055b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1056b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 1057b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 1058b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1059b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setHasExternalLexicalStorage (has_extern); 10607a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton cxx_record_decl->setHasExternalVisibleStorage (has_extern); 1061b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1062b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1063b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1064b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1065b01000fd063629facd45044f137446fb748ee179Greg Clayton 1066b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 1067b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1068b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl(); 1069b01000fd063629facd45044f137446fb748ee179Greg Clayton if (enum_decl) 1070b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1071b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_decl->setHasExternalLexicalStorage (has_extern); 10727a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton enum_decl->setHasExternalVisibleStorage (has_extern); 1073b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1074b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1075b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1076b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1077b01000fd063629facd45044f137446fb748ee179Greg Clayton 1078b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 1079b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 1080b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1081b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 1082b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (objc_class_type); 1083b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 1084b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1085b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1086b01000fd063629facd45044f137446fb748ee179Greg Clayton 1087b01000fd063629facd45044f137446fb748ee179Greg Clayton if (class_interface_decl) 1088b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1089b01000fd063629facd45044f137446fb748ee179Greg Clayton class_interface_decl->setHasExternalLexicalStorage (has_extern); 10907a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton class_interface_decl->setHasExternalVisibleStorage (has_extern); 1091b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1092b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1093b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1094b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1095b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1097b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 1098b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern); 1099b01000fd063629facd45044f137446fb748ee179Greg Clayton 1100b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 1101b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1102b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1103b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1106dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 1107dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 1108dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 1109dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 1110dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 1111dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1112494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator" 1113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 1114c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1115c2c9a149f127736550d7430653f4c1a51731442eSean Callanan const char *post_op_name = NULL; 1116c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1117494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan bool no_space = true; 1118c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 1120494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan return false; 1121494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan 1122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton post_op_name = name + OPERATOR_PREFIX_LENGTH; 1123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1124494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan if (post_op_name[0] == ' ') 1125c2c9a149f127736550d7430653f4c1a51731442eSean Callanan { 1126494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan post_op_name++; 1127494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan no_space = false; 1128c2c9a149f127736550d7430653f4c1a51731442eSean Callanan } 1129c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1130494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX 1131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH 1132dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1133dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 1134dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 1135dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 1136dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1137dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 1138dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1139c2c9a149f127736550d7430653f4c1a51731442eSean Callanan default: 1140c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1141c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1142c2c9a149f127736550d7430653f4c1a51731442eSean Callanan break; 1143dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 1144c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1145c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1146dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 1147dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 1148dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 1149dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1151dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1152dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 1153c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1154c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1155dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 1156dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 1157dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 1158dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 1164dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1165dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1166dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 1167dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 1168dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 1169dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 1170dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1171dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1172dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1173dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 1174dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1175dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1177dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1178dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1179dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1180dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 1181dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 1182dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 1183dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1192dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 1193dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 1197dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1321b01000fd063629facd45044f137446fb748ee179Greg Clayton 1322412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1323795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1324795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1325b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1326462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1327412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1328462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1329412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 13301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 13311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 133230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 133330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1334412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1335795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 13363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1337974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1338795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1339b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(ast); 1340795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1341b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 1342795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1343795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1344795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 13453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 13461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1347b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl(); 1348795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 13491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1350412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1351795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 13521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 13531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 135430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 13553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 135630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 135790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 135890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 135990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 13605325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 136190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 13625325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 136390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 136490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 13655325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 136630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 136790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 136890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 136990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 137090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 137190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 137290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 137390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1374b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast, 137590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1376b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 137790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 13788950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, 137990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 138090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 138190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1382b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (decl_name == cxx_record_decl->getDeclName()) 138330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 1384b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast, 138530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 1386b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 138730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 138830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 138930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 139030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 139130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 139230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 139330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 139490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1395dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1396dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1397dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 139890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1399dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1400dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1401b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 140290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1403b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 140490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 140590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1406dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1407dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1408dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline); 1409dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1410dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1411dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1412dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1413b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast, 1414dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 1415b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1416dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1417dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1418dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1419dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_explicit); 1420dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 142190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1422dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1423dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 142490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1425b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 142690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1427dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 142890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 142990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 143090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 143190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 143290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline); 143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 143430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1435dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1436462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 143747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 14381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 14391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 144047a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 14413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 14423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 14443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 14463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 14473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 14483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1449b01000fd063629facd45044f137446fb748ee179Greg Clayton params[param_index] = ParmVarDecl::Create (*ast, 14501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 14511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 14521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 14531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 14541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 14551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 14561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 14571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 14583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 14593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 14613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 14637a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton 14647a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic()); 14657a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate()); 14667a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD()); 14677a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty()); 14687a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract()); 14697a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor()); 14707a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor()); 14717a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment()); 14727a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor()); 1473412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1474795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1475795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1476795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 147784f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 147884f8075072eef306234f8109573067647735c111Greg Clayton( 1479b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1480462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 148184f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1482462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 148384f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 148484f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 148584f8075072eef306234f8109573067647735c111Greg Clayton) 148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1490b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1492b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = record_qual_type.getTypePtr(); 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1509b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1510b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1512b01000fd063629facd45044f137446fb748ee179Greg Clayton FieldDecl *field = FieldDecl::Create (*ast, 151384f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 151484f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 151584f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 151684f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 151784f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 151884f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 151984f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152184f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 15299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 15319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 15329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 1534b01000fd063629facd45044f137446fb748ee179Greg Clayton ClangASTContext::AddObjCClassIVar (ast, 153560a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 15369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 15379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 15389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 15399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 15401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 15419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 155224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 1556b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1561b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast == NULL || field == NULL) 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 1570b01000fd063629facd45044f137446fb748ee179Greg Clayton if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast)) 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1607b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1609b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1611b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 1612b01000fd063629facd45044f137446fb748ee179Greg Clayton 1613b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr()); 1614b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_type) 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1616b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl *record_decl = record_type->getDecl(); 1617b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_decl) 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1619b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t field_idx; 1620b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl::field_iterator field, field_end; 1621b01000fd063629facd45044f137446fb748ee179Greg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 1622b01000fd063629facd45044f137446fb748ee179Greg Clayton field != field_end; 1623b01000fd063629facd45044f137446fb748ee179Greg Clayton ++field, ++field_idx) 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1625b01000fd063629facd45044f137446fb748ee179Greg Clayton // If no accessibility was assigned, assign the correct one 1626b01000fd063629facd45044f137446fb748ee179Greg Clayton if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 1627b01000fd063629facd45044f137446fb748ee179Greg Clayton field->setAccess ((AccessSpecifier)default_accessibility); 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1637462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 16406e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 16416e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 16426e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 16436e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 1644ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)), 1645ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan SourceLocation()); 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1649e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1650e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1651e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1652e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1653e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1654e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1655e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1656e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1657e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1658e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1660462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1664b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl(); 1665b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1667b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setBases(base_classes, num_base_classes); 1668b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 167384f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 167484f8075072eef306234f8109573067647735c111Greg Clayton 1675462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 167684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 167784f8075072eef306234f8109573067647735c111Greg Clayton( 167884f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 167984f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 168084f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 168184f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 168284f8075072eef306234f8109573067647735c111Greg Clayton) 168384f8075072eef306234f8109573067647735c111Greg Clayton{ 1684b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1685b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 168684f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 168784f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 1688b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 168984f8075072eef306234f8109573067647735c111Greg Clayton 169084f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 169184f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 169284f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 169384f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 169484f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 1695b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast, 169684f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 169784f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1698b01000fd063629facd45044f137446fb748ee179Greg Clayton &ast->Idents.get(name), 169984f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 170084f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 170184f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 17029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1703b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getObjCInterfaceType(decl).getAsOpaquePtr(); 170484f8075072eef306234f8109573067647735c111Greg Clayton} 170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 170684f8075072eef306234f8109573067647735c111Greg Claytonbool 1707462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 170884f8075072eef306234f8109573067647735c111Greg Clayton{ 170984f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 171084f8075072eef306234f8109573067647735c111Greg Clayton { 171184f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 171284f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 171384f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 171484f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *super_type = super_qual_type.getTypePtr(); 171584f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 171684f8075072eef306234f8109573067647735c111Greg Clayton { 171784f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 171884f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 171984f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 172084f8075072eef306234f8109573067647735c111Greg Clayton { 172184f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 172284f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 172384f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 172484f8075072eef306234f8109573067647735c111Greg Clayton { 172584f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 172684f8075072eef306234f8109573067647735c111Greg Clayton return true; 172784f8075072eef306234f8109573067647735c111Greg Clayton } 172884f8075072eef306234f8109573067647735c111Greg Clayton } 172984f8075072eef306234f8109573067647735c111Greg Clayton } 173084f8075072eef306234f8109573067647735c111Greg Clayton } 173184f8075072eef306234f8109573067647735c111Greg Clayton return false; 173284f8075072eef306234f8109573067647735c111Greg Clayton} 173384f8075072eef306234f8109573067647735c111Greg Clayton 173484f8075072eef306234f8109573067647735c111Greg Clayton 173584f8075072eef306234f8109573067647735c111Greg Claytonbool 173684f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 173784f8075072eef306234f8109573067647735c111Greg Clayton( 1738b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1739462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 174084f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1741462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 174284f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 174384f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 17441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 174584f8075072eef306234f8109573067647735c111Greg Clayton) 174684f8075072eef306234f8109573067647735c111Greg Clayton{ 174784f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 174884f8075072eef306234f8109573067647735c111Greg Clayton return false; 174984f8075072eef306234f8109573067647735c111Greg Clayton 1750b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 175184f8075072eef306234f8109573067647735c111Greg Clayton 1752b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 175384f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 175484f8075072eef306234f8109573067647735c111Greg Clayton 175584f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 175684f8075072eef306234f8109573067647735c111Greg Clayton 175784f8075072eef306234f8109573067647735c111Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 175884f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 175984f8075072eef306234f8109573067647735c111Greg Clayton { 176084f8075072eef306234f8109573067647735c111Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 176184f8075072eef306234f8109573067647735c111Greg Clayton 176284f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 176384f8075072eef306234f8109573067647735c111Greg Clayton { 176484f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 176584f8075072eef306234f8109573067647735c111Greg Clayton 176684f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 176784f8075072eef306234f8109573067647735c111Greg Clayton { 176884f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 176984f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 177084f8075072eef306234f8109573067647735c111Greg Clayton { 1771b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1772b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 177384f8075072eef306234f8109573067647735c111Greg Clayton } 177484f8075072eef306234f8109573067647735c111Greg Clayton 1775b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast, 17769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 17779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 17789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 17799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 17809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 17819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 17829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 17831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 17849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 17869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 17879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 17889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 17899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 179084f8075072eef306234f8109573067647735c111Greg Clayton } 179184f8075072eef306234f8109573067647735c111Greg Clayton } 179284f8075072eef306234f8109573067647735c111Greg Clayton } 179384f8075072eef306234f8109573067647735c111Greg Clayton return false; 179484f8075072eef306234f8109573067647735c111Greg Clayton} 179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 17979488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1798462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 17999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 18009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 18019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 18039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 18049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 18069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 18089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 18099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 18119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 18129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18139488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 18149488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 18159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 18169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 18179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 18199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 18209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 18239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 18249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 18259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 18279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 18281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1829462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 18301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 18311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1832b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1833462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 18341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1835462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 18361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 18371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 18381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 18391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 18401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1842b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 18431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1844b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 18451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 18461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 18481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *class_type = class_qual_type.getTypePtr(); 18501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 18511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 18541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 18561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 18591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 18611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 18641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 18651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 18681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 18691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 18711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1872ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 18731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1874ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1875ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1876ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1877ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 18781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1879ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 18801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1881ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 18826bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 18836bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1884ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 18851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 18866bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 18876bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 18881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 18891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 18921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 18931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1894b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 18951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 18961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 18981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 19001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton clang::Type *method_type(method_qual_type.getTypePtr()); 19011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 19031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 19061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 19081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 19121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 19131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 19141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 19151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1918b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast, 19191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 19201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 19211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 19221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 19231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 19241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 19261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 19271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 19281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 19301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 19311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 19371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 19391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1942b01000fd063629facd45044f137446fb748ee179Greg Clayton params.push_back (ParmVarDecl::Create (*ast, 19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 19441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 19481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1953b01000fd063629facd45044f137446fb748ee179Greg Clayton objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args); 19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 19601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1963bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 1964f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 1965f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 1966f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 1967b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ASTContext *ast, 1968f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 1969f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 1970bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 1971bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 1972f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 1973f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1974f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1975f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 1976bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1977bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1978bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 1979bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1980bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 1981bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 198204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 198304325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 198404325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 198504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 198604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 1987b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast && pointee_or_element_clang_type) 1988b01000fd063629facd45044f137446fb748ee179Greg Clayton *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 198904325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 1990f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1991f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 1992f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 199304325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 199404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 1995f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 1996f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 1997f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 1998f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1999f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 2000f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2001e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue; 2002f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2003f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 2004f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 2005f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 2006f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 2007f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2008f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 2009f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 2010f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2011bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 2012bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 2013bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 2014bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 2015f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2016f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 2017f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2018f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 2019f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 2020f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2021bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 2022bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 2023bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 2024bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 2025bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 2026f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2027f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2028f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2029f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2030f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 2031f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 2032f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2033bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 2034f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2035f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 2036f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2037f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2038f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 2039f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2040bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2041bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2042f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2043f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 2044f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2045f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2046f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 2047f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2048bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 2049bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 2050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 2051bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2052bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 2053bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 2054bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 2055bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 2056bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 2057f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 20599e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2060b01000fd063629facd45044f137446fb748ee179Greg Clayton ast, 2061f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 2062f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 2064bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 2065bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 2067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 2068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2069bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 2070bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2071bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 20729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 207324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 207524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2076462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 207724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 207924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 208024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 208403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 20871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 20881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 20891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 20901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 20911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 20929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 20939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 20979e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2107b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes) 210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2109b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 2113b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 21149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 21159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2117960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2118960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 2119960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2120f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 2121960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 2122960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2124960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2125960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2126960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2127960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2128960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2129c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2130e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 0; 2131c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 21321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 21337a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 213424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 213524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 214524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 214724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 216824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 216924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 21759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 21767a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 21799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 21809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 21819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 21839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 21859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 21889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 21899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 21919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 21929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 21939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 21949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 21969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 21979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 21989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 2206960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2207960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 2208960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2209b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2210b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2211960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 2212960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 2213960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 2214960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2215960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2216960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 2217960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2218960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 2227c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType pointee_type (pointer_type->getPointeeType()); 2228b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2229b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 22309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 2232c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2233c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We have a pointer to a pointee type that claims it has no children. 2234c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We will want to look at 2235c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr()); 2236c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2242f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2243f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2244f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2245f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 2246f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 2247b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2248b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2249f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 2250f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 2251f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 2252f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 2253f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2254f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 2255f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2256f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2257f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2258f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 22591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 2260b01000fd063629facd45044f137446fb748ee179Greg Clayton num_children = ClangASTContext::GetNumChildren (ast, 2261b01000fd063629facd45044f137446fb748ee179Greg Clayton cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2262b01000fd063629facd45044f137446fb748ee179Greg Clayton omit_empty_base_classes); 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2271c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no 2272c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a 2273c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer, 2274c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type 2275c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show. 2276c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t 2277c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type) 2278c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{ 2279c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (clang_type == NULL) 2280c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2281c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2282c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2283c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2284c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton switch (type_class) 2285c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 22869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::Type::Builtin: 22879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 22889db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton { 22899db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Void: 22909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::NullPtr: 22919db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 0; 22929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Bool: 22939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_U: 22949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UChar: 2295ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_U: 22969db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char16: 22979db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char32: 22989db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UShort: 22999db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt: 23009db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULong: 23019db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULongLong: 23029db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt128: 23039db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_S: 23049db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::SChar: 2305ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_S: 23069db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Short: 23079db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int: 23089db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Long: 23099db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongLong: 23109db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int128: 23119db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Float: 23129db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Double: 23139db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongDouble: 23149db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Dependent: 23159db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Overload: 23169db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UndeducedAuto: 23179db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCId: 23189db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCClass: 23199db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCSel: 23209db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 1; 23219db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton } 23229db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton break; 23239db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 2324e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 1; 2325c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Pointer: return 1; 2326c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 2327c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::LValueReference: return 1; 2328c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::RValueReference: return 1; 2329c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::MemberPointer: return 0; 2330c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ConstantArray: return 0; 2331c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::IncompleteArray: return 0; 2332c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::VariableArray: return 0; 2333c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedArray: return 0; 2334c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedExtVector: return 0; 2335c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Vector: return 0; 2336c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ExtVector: return 0; 2337c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 2338c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 2339c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2340c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Paren: return 0; 2341c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2342c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOfExpr: return 0; 2343c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOf: return 0; 2344c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Decltype: return 0; 2345c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Record: return 0; 2346c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Enum: return 1; 2347c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Elaborated: return 1; 2348c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateTypeParm: return 1; 2349c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::SubstTemplateTypeParm: return 1; 2350c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateSpecialization: return 1; 2351c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::InjectedClassName: return 0; 2352c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentName: return 1; 2353c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentTemplateSpecialization: return 1; 2354c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObject: return 0; 2355c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCInterface: return 0; 2356c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObjectPointer: return 1; 2357c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2358c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton break; 2359c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2360c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2361c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton} 236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2363462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2367462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2375bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 237600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 237700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2392bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 239300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 239400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2398462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 2401b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2403462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2411bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 241200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 241300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 241424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 241524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 241624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2419b01000fd063629facd45044f137446fb748ee179Greg Clayton if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes)) 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2424bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 242603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 242703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2429960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2430960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2431960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2432960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2433960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 243404325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 2435b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT; 2436b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 2437960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2438960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2439960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2440960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2441960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2442960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 24431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 24447a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 2449b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl); 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 245224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 246924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 247024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 2478a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 2480a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 248124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2489b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes biut sizes should be a multiple of 8 bits in size 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2494bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 2515b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType()); 251654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 251924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 2523b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size)) 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 252824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 25339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 25347a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 25359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 25379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 25389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 25399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 25419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 25429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 25449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2546b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl); 25479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 25489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 25499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 25519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2552b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 25539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 25559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2556b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl)); 25579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 25609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2561b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 25629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2564960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2565bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 25669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 25689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 25719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 25739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 25749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 25759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2576960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2577960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 25789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 25809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 25829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 25849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 25869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 25889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 25909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 25929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2593b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 25949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 25969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 2598960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 25999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 26009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 26029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 26109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 26129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2613960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2614960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2615960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2616960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2617960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 261800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 261900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 2620b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 2621960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2622960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2623960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2624960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2625960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2626960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2627960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2628960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2629960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2630bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 263100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 263200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2633960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2634960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2635960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 263600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 2637960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2638960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2639960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2640960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2641960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2642960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2643960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2644960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2645960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2646b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2647960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2648960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2649960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2650960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2651960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2652960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 26539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 26559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2663b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetCompleteQualType (ast, array->getElementType())) 2664b01000fd063629facd45044f137446fb748ee179Greg Clayton { 2665b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2667b01000fd063629facd45044f137446fb748ee179Greg Clayton char element_name[64]; 2668b01000fd063629facd45044f137446fb748ee179Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2670b01000fd063629facd45044f137446fb748ee179Greg Clayton child_name.assign(element_name); 2671b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(field_type_info.first % 8 == 0); 2672b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = field_type_info.first / 8; 2673b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_offset = idx * child_byte_size; 2674b01000fd063629facd45044f137446fb748ee179Greg Clayton return array->getElementType().getAsOpaquePtr(); 2675b01000fd063629facd45044f137446fb748ee179Greg Clayton } 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 26849db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 26859db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton // Don't dereference "void *" pointers 26869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (pointee_type->isVoidType()) 26879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return NULL; 268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 269100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 269200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 2693b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 270224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2703bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 270400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 270500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 270900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 271000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2720b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2730f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2731f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2732f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2733f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2734f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2735f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2736f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2737f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 273800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 273900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 2740b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 2741f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2742f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2743f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2744f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2745f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 2746f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2747f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2748f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2749f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2750f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 275100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 275200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2753f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2754f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2755f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2756f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2757f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2759f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2760f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2761f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2762f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2763f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2764f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2765b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2766f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2767f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2768f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2771f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2772f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2773f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2774f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 27751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 2776b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 27789e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 277924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 278124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 278224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 278700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 278800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2795f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2801b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false; 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 281324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 284024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 285024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 2975b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 2976462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 298503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 298603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 29897a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 3022b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name)); 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 30779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 30787a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 30799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 30819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 30829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 30839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 30849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 30869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 30879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 30889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 30899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 30919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 30929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3093823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 30949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 30969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 30979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 30989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 30999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 31009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 31019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 31029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 31049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 31059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 31099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 31119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 31129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 31139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 31149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3115b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetIndexOfChildMemberWithName (ast, 3116b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 31179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 31209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 31229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 31239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 31249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 31279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 31289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 31299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 31309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 31359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 31379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3138b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 31399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 31409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 31419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 31429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 31439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 31459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3154b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3175b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 31821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 31831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3190b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 319324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3206b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 320724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 321424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 322124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 322224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3223b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 322424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 322924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3234b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 32359e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 323824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 324524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3255b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3256462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 32649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 326503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 32669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 326703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 32707a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 327724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 329424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 33139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 33147a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 33159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 33179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 33189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 33199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 33209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 33229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 33239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 33259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 33279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 33289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 33309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 33329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 33349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 33369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 33379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 33389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 33409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 33449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 33469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 33479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 33529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 33549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3355b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 33569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 33579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 33589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 33599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 33619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 336624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 336724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3369b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 337524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 337624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 337724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 337824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 338024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 338124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3390b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 33971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 33981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3405b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3420b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 342924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3436b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 343724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 343924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 344424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3447b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 34489e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 345224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 345424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 345924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3462462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 34671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = tag_qual_type.getTypePtr(); 346824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 346924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(clang_type); 347124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 347224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 347324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 347424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3489462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 349124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 349503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 349603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 34999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 35009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 35019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 35029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 35039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 35049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 35059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 35069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 35079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 35089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 35099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 35109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 35119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 35129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 35139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 35149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 35159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 35169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 35179e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 35189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 35199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 35209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 35219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 35229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 35239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3538b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 3540b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 3541b01000fd063629facd45044f137446fb748ee179Greg Clayton return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), &ast->Idents.get(name)); 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 354824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3550462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3554b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3555b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 355824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3559b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3560b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3562b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationName (&ast->Idents.get(name)), 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3571b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3572b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 357424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3585462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3586b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast, 3587462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3588462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 35892ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 35902ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 35912ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3593b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 3599ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan FunctionProtoType::ExtProtoInfo proto_info; 3600ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Variadic = is_variadic; 3601ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.HasExceptionSpec = false; 3602ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.HasAnyExceptionSpec = false; 3603ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.TypeQuals = type_quals; 3604ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.NumExceptions = 0; 3605ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Exceptions = NULL; 3606ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan 3607b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getFunctionType(QualType::getFromOpaquePtr(result_type), 360853d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 3610ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info).getAsOpaquePtr(); // NoReturn); 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 361224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 361324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3614462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 361524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3616b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3617b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 3618b01000fd063629facd45044f137446fb748ee179Greg Clayton return ParmVarDecl::Create(*ast, 3619b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3621b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL, 36222ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 362524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 362624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 362824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3639462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3640462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 364124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 364224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 364324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3644b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3645b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 364624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 3647b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 364824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3659462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 36641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *t = qual_type.getTypePtr(); 366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagType *tag_type = dyn_cast<TagType>(t); 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3683462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 368524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 368624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 368724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 368855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 368955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 369055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 369155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 369355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 369455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 369555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 369655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 369755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 369804325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 369904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 370004325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 370104325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 370204325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 370304325065a00f646527db85e9bc751da29ac53b23Sean Callanan 370404325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 370504325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 370604325065a00f646527db85e9bc751da29ac53b23Sean Callanan 370755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 370855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 370955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 371055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 371155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 371255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 371355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 371555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 371655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 371755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 371855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 371955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3720b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 372148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 372248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 372348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 372448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 3725b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) 372648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 372748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 3728b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->IntTy; 372948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 3730b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->UnsignedIntTy; 373148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 373248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 373348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 373448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 373548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 373655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 374424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 374524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3746462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 37470d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType 37480d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton( 37490d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const char *name, 37500d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton DeclContext *decl_ctx, 37510d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const Declaration &decl, 37520d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton clang_type_t integer_qual_type 37530d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton) 375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 375624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3757b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3758b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 375948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 376048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 376148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 376248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 376348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 3764b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast, 37650d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton decl_ctx, 376648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 3767b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL, 376848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 37699e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan NULL, 37709e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScoped 37719e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScopedUsingClassTag 37729e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false); // IsFixed 3773864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3774864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3776e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3777e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3778e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 3779864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3780864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan enum_decl->setAccess(AS_public); // TODO respect what's in the debug info 3781864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3782b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(enum_decl).getAsOpaquePtr(); 3783e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3787462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3788462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3789462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3790462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3791462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3792462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 3793462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3794462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3795462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3796462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3797462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3798462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3799462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3800462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3801462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3802462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3803462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3804462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3808462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3809462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 381724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 381824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 381924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3820b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 382224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3823b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 382424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 382524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 382624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton clang::Type *clang_type = enum_qual_type.getTypePtr(); 382824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 382924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 383024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 383324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 383424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 383524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 383624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 3837b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumConstantDecl::Create (*ast, 3838b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_type->getDecl(), 3839b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 3840b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 3841b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType::getFromOpaquePtr(enumerator_clang_type), 3842b01000fd063629facd45044f137446fb748ee179Greg Clayton NULL, 3843b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_llvm_apsint); 3844b01000fd063629facd45044f137446fb748ee179Greg Clayton 384524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 384624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 384824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 384924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 385024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 385124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 385224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 385324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 385424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 385524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 385624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 385724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3858462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3859462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 386024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3861427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return CreatePointerType (getASTContext(), clang_type); 3862427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3863427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t 3865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type) 3866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 38687b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 38697b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 38707b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 387103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 387203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 38737b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 38747b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 38757b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 3876427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 38777b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 38787b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 3879427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getPointerType(qual_type).getAsOpaquePtr(); 38807b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 38817b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3885462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 38866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast, 38876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 38906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 389324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3894462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 38956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast, 38966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 389724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 389824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 38996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 390024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3903462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3904462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3905fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3906fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3907fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3908fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3909fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3910fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3911fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3915b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3916b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypeSize(ast->VoidPtrTy); 391724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 391824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3920462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 392124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 392224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 392324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 392424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 392524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 392603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 392703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 392824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 392904325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 393004325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 393104325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 393204325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 393304325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 393404325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 393504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 393604325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 393704325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 393804325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 39391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 394224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 394924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 395024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 395224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 396124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 39649e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 396524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 396624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 396724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 396824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 397024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 397124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3972462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 398724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 399024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 399124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3992462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 399324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 399424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 399524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 399703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 399803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 399924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 400004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 400104325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 400204325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 400304325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 400404325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 400504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 400604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 400704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 400804325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 400904325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 40101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 401524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 401924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 402024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 402424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 40279e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type); 402824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 402924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 403224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4036462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 403824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 403924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 404024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 404124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 404724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 404824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 404924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 405024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 405124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 405224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 405324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 405424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 405624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 405724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 405824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 405924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 406024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 406124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 406224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 406324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 406424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 406524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 406624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 407024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4075bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 4076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 4077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 4078bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 4079bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4080bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4081bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4082bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 4083bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 4084bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4085bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 4086bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 4087bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4088bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4089bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 4090bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 4091bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 4092bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4093bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 40941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4095462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 40961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 40971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 40981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 40991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 41001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 41011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 41021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 41031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 41041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 41051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 41061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4107462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 41081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 41091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 41101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 41111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 41121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 41131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 41141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 41151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 41161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 41171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 41181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 4119f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 4120f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 4121f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4122f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 4124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4125f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 412624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 412724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4128462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 412924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 4131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 4132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4133f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 4134f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4136f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 413724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4138f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 4139f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 414124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 414424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4145f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 4146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 4147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 4148f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 414924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 415124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 4153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 415424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 415524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 415624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 415724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 415824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 415924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 416024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 416124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4162462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 416303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 416403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 416503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 416603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 416703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 416803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 416903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 417003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 417103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 417203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 417303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 417403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 41759e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 417603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 417703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 417803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 417903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 418003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 418103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 418203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 418303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 418403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 418503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 418603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 418703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 418803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 418903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 4190f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 4191f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 4192f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4193f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4194f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 4195f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 4196f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (array) 4197f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return array->getSize().getLimitedValue(); 4198f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 4199f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 4200f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 420103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 420203e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 4203462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 420424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 420524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 420624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 420724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 420824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 420924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 421003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 421103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 421224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 421424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 421524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 421624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 421724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 421824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 42191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 422024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 422124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 422224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 422324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 422424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 42251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 422624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 422724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 422824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 422924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 42301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 423124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 423224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 423324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 423424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 423524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 423624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 423724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 423824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 423924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 424024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 424124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 424224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4243462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4244462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 424524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 424624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 424724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 424824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4249b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 425024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 4251b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 425224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 425324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 4254b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 4255b01000fd063629facd45044f137446fb748ee179Greg Clayton TypedefDecl *decl = TypedefDecl::Create (*ast, 4256b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx, 4257b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 4258b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 4259b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->CreateTypeSourceInfo(qual_type)); 4260864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 4261864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan decl->setAccess(AS_public); // TODO respect proper access specifier 426224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 426324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 4264b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypedefType (decl).getAsOpaquePtr(); 426524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 426624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 426724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 426824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 426924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 427024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 4271462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 427224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 427324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 427424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4275462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 427624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4277462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 427824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 427924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4280462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefDecl *typedef_decl = typedef_type->getDecl(); 428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 428224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 428324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 428424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 428524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 428624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 428724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 428824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 428924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 429024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 429124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 429224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 429324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 429424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 429524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 429624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 429724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 4298b01000fd063629facd45044f137446fb748ee179Greg Clayton//ClangASTContext::ConvertFloatValueToString (ASTContext *ast, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str) 429924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 430024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 430124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 430224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 430324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 430424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 430524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 430624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 430724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 430824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 431024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 431224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 431324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 431424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 431524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 431624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 431724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 431824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 431924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 432024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 432124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 432224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 432324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 432424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 432524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 432624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 432724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 433124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 433224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 4333b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 433524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 433724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 433924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 434324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 4347b01000fd063629facd45044f137446fb748ee179Greg Clayton APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref); 434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4349b01000fd063629facd45044f137446fb748ee179Greg Clayton const uint64_t bit_size = ast->getTypeSize (qual_type); 435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 435124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 435224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 436024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4370a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4371a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 4372462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 4373a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 4374a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 4375a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4376a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4377a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4378a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 4379a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 4380b01000fd063629facd45044f137446fb748ee179Greg Clayton 4381b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4382b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type) 4383b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4384b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 4385b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 4386b01000fd063629facd45044f137446fb748ee179Greg Clayton 43877a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type)); 4388b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4389b01000fd063629facd45044f137446fb748ee179Greg Clayton 4390b01000fd063629facd45044f137446fb748ee179Greg Clayton 4391b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4392b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type) 4393b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4394b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::GetCompleteType (getASTContext(), clang_type); 4395b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4396b01000fd063629facd45044f137446fb748ee179Greg Clayton 4397