ClangASTContext.cpp revision 0de254aaec7d6766379191e5397ec2294042c5d7
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 57395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Core/ArchSpec.h" 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h" 59f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h" 60839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h" 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h> 63f05633b35544b5d095feb05680c8728be087e441Eli Friedman 64585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69b01000fd063629facd45044f137446fb748ee179Greg Clayton 70b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic bool 71b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type) 72b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 73b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 74b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 75b01000fd063629facd45044f137446fb748ee179Greg Clayton { 76b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 77b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 78b01000fd063629facd45044f137446fb748ee179Greg Clayton { 79d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr()); 80b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_type) 81b01000fd063629facd45044f137446fb748ee179Greg Clayton { 82b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::TagDecl *tag_decl = tag_type->getDecl(); 83b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl) 84b01000fd063629facd45044f137446fb748ee179Greg Clayton { 85b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl->getDefinition()) 86b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 87b01000fd063629facd45044f137446fb748ee179Greg Clayton 88b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl->hasExternalLexicalStorage()) 89b01000fd063629facd45044f137446fb748ee179Greg Clayton { 90b01000fd063629facd45044f137446fb748ee179Greg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 91b01000fd063629facd45044f137446fb748ee179Greg Clayton if (external_ast_source) 92b01000fd063629facd45044f137446fb748ee179Greg Clayton { 93b01000fd063629facd45044f137446fb748ee179Greg Clayton external_ast_source->CompleteType(tag_decl); 94b01000fd063629facd45044f137446fb748ee179Greg Clayton return !tag_type->isIncompleteType(); 95b01000fd063629facd45044f137446fb748ee179Greg Clayton } 96b01000fd063629facd45044f137446fb748ee179Greg Clayton } 97b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 98b01000fd063629facd45044f137446fb748ee179Greg Clayton } 99b01000fd063629facd45044f137446fb748ee179Greg Clayton } 100b01000fd063629facd45044f137446fb748ee179Greg Clayton 101b01000fd063629facd45044f137446fb748ee179Greg Clayton } 102b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 103b01000fd063629facd45044f137446fb748ee179Greg Clayton 104b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 105b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 106b01000fd063629facd45044f137446fb748ee179Greg Clayton { 107d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type); 108b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 109b01000fd063629facd45044f137446fb748ee179Greg Clayton { 110b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 111b01000fd063629facd45044f137446fb748ee179Greg Clayton // We currently can't complete objective C types through the newly added ASTContext 112b01000fd063629facd45044f137446fb748ee179Greg Clayton // because it only supports TagDecl objects right now... 113b01000fd063629facd45044f137446fb748ee179Greg Clayton bool is_forward_decl = class_interface_decl->isForwardDecl(); 114b01000fd063629facd45044f137446fb748ee179Greg Clayton if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage()) 115b01000fd063629facd45044f137446fb748ee179Greg Clayton { 116b01000fd063629facd45044f137446fb748ee179Greg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 117b01000fd063629facd45044f137446fb748ee179Greg Clayton if (external_ast_source) 118b01000fd063629facd45044f137446fb748ee179Greg Clayton { 119b01000fd063629facd45044f137446fb748ee179Greg Clayton external_ast_source->CompleteType (class_interface_decl); 120b01000fd063629facd45044f137446fb748ee179Greg Clayton is_forward_decl = class_interface_decl->isForwardDecl(); 121b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1227a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return is_forward_decl == false; 123b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1247a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return true; 125b01000fd063629facd45044f137446fb748ee179Greg Clayton } 126b01000fd063629facd45044f137446fb748ee179Greg Clayton } 127b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 128b01000fd063629facd45044f137446fb748ee179Greg Clayton 129b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 130b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()); 131b01000fd063629facd45044f137446fb748ee179Greg Clayton 132b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 133b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 134b01000fd063629facd45044f137446fb748ee179Greg Clayton } 135b01000fd063629facd45044f137446fb748ee179Greg Clayton 136b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 137b01000fd063629facd45044f137446fb748ee179Greg Clayton} 138b01000fd063629facd45044f137446fb748ee179Greg Clayton 139b01000fd063629facd45044f137446fb748ee179Greg Clayton 14084f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 141585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 14284f8075072eef306234f8109573067647735c111Greg Clayton{ 14384f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 14484f8075072eef306234f8109573067647735c111Greg Clayton { 145585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 146585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 147585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 148585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 149585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 15084f8075072eef306234f8109573067647735c111Greg Clayton } 15184f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 15284f8075072eef306234f8109573067647735c111Greg Clayton} 15384f8075072eef306234f8109573067647735c111Greg Clayton 15484f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 155585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 15684f8075072eef306234f8109573067647735c111Greg Clayton{ 15784f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 15884f8075072eef306234f8109573067647735c111Greg Clayton { 159585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 160585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 161585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 162585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 163585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 164585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 16584f8075072eef306234f8109573067647735c111Greg Clayton } 16684f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 16784f8075072eef306234f8109573067647735c111Greg Clayton} 16884f8075072eef306234f8109573067647735c111Greg Clayton 16984f8075072eef306234f8109573067647735c111Greg Clayton 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 174e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 182e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 184e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 185e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 186e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 187e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 196e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 197e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 198279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case IK_LLVM_IR: 199b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (!"Invalid input kind!"); 200e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 203279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case IK_CUDA: 204279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan LangStd = LangStandard::lang_cuda; 205279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 206e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 207e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 208e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 209e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 210e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 213e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 214e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 215e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 216e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 2648950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan Opts.setVisibilityMode(DefaultVisibility); 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 339b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) : 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 341b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap(), 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 349b01000fd063629facd45044f137446fb748ee179Greg Clayton m_builtins_ap(), 350b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_tag_decl (NULL), 351b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_objc_decl (NULL), 352b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_baton (NULL) 353b01000fd063629facd45044f137446fb748ee179Greg Clayton 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 372b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 379b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid 404395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch) 405395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 406395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton Clear(); 407395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_target_triple.assign(arch.GetTriple().str()); 408395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 409395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 410b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 411b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource () 412b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 413b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 414b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 415b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getExternalSource () != NULL; 416b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 417b01000fd063629facd45044f137446fb748ee179Greg Clayton} 418b01000fd063629facd45044f137446fb748ee179Greg Clayton 419b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 420b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap) 421b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 422b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 423b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 424b01000fd063629facd45044f137446fb748ee179Greg Clayton { 425b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (ast_source_ap); 426b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true); 427b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true); 428b01000fd063629facd45044f137446fb748ee179Greg Clayton } 429b01000fd063629facd45044f137446fb748ee179Greg Clayton} 430b01000fd063629facd45044f137446fb748ee179Greg Clayton 431b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 432b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource () 433b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 434b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 435b01000fd063629facd45044f137446fb748ee179Greg Clayton 436b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 437b01000fd063629facd45044f137446fb748ee179Greg Clayton { 438b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap; 439b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (empty_ast_source_ap); 440b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false); 441b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false); 442b01000fd063629facd45044f137446fb748ee179Greg Clayton } 443b01000fd063629facd45044f137446fb748ee179Greg Clayton} 444b01000fd063629facd45044f137446fb748ee179Greg Clayton 445b01000fd063629facd45044f137446fb748ee179Greg Clayton 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 450b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get() == NULL) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 452b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(new ASTContext (*getLanguageOptions(), 453b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSourceManager(), 454b01000fd063629facd45044f137446fb748ee179Greg Clayton *getTargetInfo(), 455b01000fd063629facd45044f137446fb748ee179Greg Clayton *getIdentifierTable(), 456b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSelectorTable(), 457b01000fd063629facd45044f137446fb748ee179Greg Clayton *getBuiltinContext(), 458b01000fd063629facd45044f137446fb748ee179Greg Clayton 0)); 459887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 460b01000fd063629facd45044f137446fb748ee179Greg Clayton if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton) 461b01000fd063629facd45044f137446fb748ee179Greg Clayton { 462b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage(); 463b01000fd063629facd45044f137446fb748ee179Greg Clayton //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage(); 464b01000fd063629facd45044f137446fb748ee179Greg Clayton } 465b01000fd063629facd45044f137446fb748ee179Greg Clayton 466b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false); 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 468b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap.get(); 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 493e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 494e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5078a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager * 5088a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager() 5098a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 5108a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_manager_ap.get() == NULL) 51122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton { 51222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton clang::FileSystemOptions file_system_options; 51322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_file_manager_ap.reset(new clang::FileManager(file_system_options)); 51422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton } 5158a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_manager_ap.get(); 5168a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 5178a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 5181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 52222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager())); 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 530eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton { 531eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs()); 532eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton m_diagnostic_ap.reset(new Diagnostic(diag_id_sp)); 533eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton } 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 537887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient 538887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 539887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic: 540887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan NullDiagnosticClient () 541887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 542887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 543887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 544887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 545887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 546887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 547887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_log) 548887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 549887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 550887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan info.FormatDiagnostic(diag_str); 551887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan diag_str.push_back('\0'); 552887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 553887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 554887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 555887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate: 556887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan LogSP m_log; 557887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}; 558887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 559887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient * 560887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient() 561887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 562887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_diagnostic_client_ap.get() == NULL) 563887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_diagnostic_client_ap.reset(new NullDiagnosticClient); 564887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 565887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan return m_diagnostic_client_ap.get(); 566887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan} 567887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 593b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type) 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 595b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t qual_type_bit_size = ast->getTypeSize(qual_type); 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 601462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 602585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 604b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 606b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 608b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size); 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 611462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 612b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size) 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 614b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 619585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 620b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 621b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 624585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 625b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 626b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 627b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 628b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 629b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 630b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 631b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 632b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 633b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 634b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 635b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 636b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 639585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 640b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 641b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 642b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 643b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 644b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 645b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 646b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 647b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 648b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 649b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 650b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 651b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 654585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 655b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 656b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 657b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 658b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 659b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 660b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 663585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 671462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 674b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 677b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 678b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 686b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 687b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 691b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy)) 692b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->BoolTy.getAsOpaquePtr(); 693b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 694b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 695b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 696b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 697b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 698b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 701e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case DW_ATE_lo_user: 702e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton // This has been seen to mean DW_AT_complex_integer 7039353338e34d711856c80754721fe425bc765c6f3Greg Clayton if (::strstr(type_name, "complex")) 704e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 705e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2); 706b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr(); 707e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 708e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton break; 709e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 711b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy)) 712b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatComplexTy.getAsOpaquePtr(); 713b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy)) 714b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleComplexTy.getAsOpaquePtr(); 715b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy)) 716b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleComplexTy.getAsOpaquePtr(); 717e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else 718e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 719e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2); 720b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr(); 721e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 725b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 726b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 727b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 728b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 729b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 730b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7368ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 738b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 739b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7418ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 743b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 744b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 748b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 749b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7518ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 753b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 754b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 755b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 756b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7588ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 7598ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 760b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 761b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 762b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 763b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 7648ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 7658ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (streq(type_name, "wchar_t")) 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 767b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy)) 768b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->WCharTy.getAsOpaquePtr(); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7707bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton else if (streq(type_name, "void")) 7717bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton { 7727bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy)) 7737bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton return ast->VoidTy.getAsOpaquePtr(); 7747bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton } 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 777b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 778b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 779b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 780b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 781b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 782b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 783b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 784b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 785b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 786b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 787b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 788b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 796b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 797b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 800b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 801b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 802b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 803b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8098ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 811b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 812b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8148ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 816b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 817b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8198ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 821b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 822b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 826b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 827b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 8308ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 831b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 832b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 833b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 834b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 8358ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 838b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 839b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 840b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 841b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 842b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 843b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 844b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 845b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 846b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 847b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 848b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 849b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 853b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 854b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 8557bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 8567bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 869462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 870b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast) 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 872b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidTy.getAsOpaquePtr(); 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 875462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 876a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool() 877a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{ 878a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan return getASTContext()->BoolTy.getAsOpaquePtr(); 879a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan} 880a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan 881a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t 882960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 883960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 884c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr(); 885960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 886960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 887462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 888960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 889960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 89004325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 891960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 892960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 893462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 894960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 895960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 896c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr(); 897960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 898960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 899462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 900fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast) 901fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 902fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return ast->UnknownAnyTy.getAsOpaquePtr(); 903fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 904fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 905fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananclang_type_t 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 916462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 922462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 923b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const) 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 925b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType void_ptr_type(ast->VoidPtrTy); 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 933462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 93422defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast, 93522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 936462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9388a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 93922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 94022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 941ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 942ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 943cf18faaf72090a68480145ca206955d792633559Sean Callanan 94422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType src (QualType::getFromOpaquePtr(clang_type)); 94522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType dst (importer.Import(src)); 946cf18faaf72090a68480145ca206955d792633559Sean Callanan 947cf18faaf72090a68480145ca206955d792633559Sean Callanan return dst.getAsOpaquePtr(); 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9516916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl * 95222defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast, 95322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 9546916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *source_decl) 955887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 9568a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 95722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 95822defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 959ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 960ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 9616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return importer.Import(source_decl); 9636916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 9646916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9658d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 966b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast, 967462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 968462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 9695510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 97004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton return ast->hasSameType (QualType::getFromOpaquePtr(type1), 97104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton QualType::getFromOpaquePtr(type2)); 9725510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 9735510dddc33260a991284ef81ca343594f23262e8Sean Callanan 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 976462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 977462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 988462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 989462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1000462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1001462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1012b01000fd063629facd45044f137446fb748ee179Greg Clayton 1013b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1014b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl) 1015b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1016b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1017b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1018b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1019b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1020b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr(); 1021b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1022b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1023b01000fd063629facd45044f137446fb748ee179Greg Clayton 1024b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1025b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl) 1026b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1027b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1028b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1029b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1030b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1031b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr(); 1032b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1033b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1034b01000fd063629facd45044f137446fb748ee179Greg Clayton 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1037462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1038585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1040b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1041b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 104204325065a00f646527db85e9bc751da29ac53b23Sean Callanan 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 1044b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1047585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 10489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1049306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 10509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 10519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 10529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 10539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 1059b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *decl = CXXRecordDecl::Create(*ast, 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 1063279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1064b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL); 1065b01000fd063629facd45044f137446fb748ee179Greg Clayton 1066b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(decl).getAsOpaquePtr(); 1067b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1068b01000fd063629facd45044f137446fb748ee179Greg Clayton 1069b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 1070b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern) 1071b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1072b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 1073b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 1074b01000fd063629facd45044f137446fb748ee179Greg Clayton 1075b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1076b01000fd063629facd45044f137446fb748ee179Greg Clayton 1077b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1078b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 1079b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1080b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 1081b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1082b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 1083b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 1084b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1085b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setHasExternalLexicalStorage (has_extern); 10867a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton cxx_record_decl->setHasExternalVisibleStorage (has_extern); 1087b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1088b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1089b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1090b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1091b01000fd063629facd45044f137446fb748ee179Greg Clayton 1092b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 1093b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1094b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl(); 1095b01000fd063629facd45044f137446fb748ee179Greg Clayton if (enum_decl) 1096b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1097b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_decl->setHasExternalLexicalStorage (has_extern); 10987a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton enum_decl->setHasExternalVisibleStorage (has_extern); 1099b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1100b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1101b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1102b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1103b01000fd063629facd45044f137446fb748ee179Greg Clayton 1104b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 1105b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 1106b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1107d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 1108b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (objc_class_type); 1109b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 1110b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1111b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1112b01000fd063629facd45044f137446fb748ee179Greg Clayton 1113b01000fd063629facd45044f137446fb748ee179Greg Clayton if (class_interface_decl) 1114b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1115b01000fd063629facd45044f137446fb748ee179Greg Clayton class_interface_decl->setHasExternalLexicalStorage (has_extern); 11167a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton class_interface_decl->setHasExternalVisibleStorage (has_extern); 1117b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1118b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1119b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1120b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1121b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1123b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 1124b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern); 1125b01000fd063629facd45044f137446fb748ee179Greg Clayton 1126b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 1127b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1128b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1129b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1132dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 1133dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 1134dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 1135dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 1136dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 1137dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1138494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator" 1139427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 1140c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1141c2c9a149f127736550d7430653f4c1a51731442eSean Callanan const char *post_op_name = NULL; 1142c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1143494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan bool no_space = true; 1144c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1145427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 1146494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan return false; 1147494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan 1148427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton post_op_name = name + OPERATOR_PREFIX_LENGTH; 1149427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1150494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan if (post_op_name[0] == ' ') 1151c2c9a149f127736550d7430653f4c1a51731442eSean Callanan { 1152494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan post_op_name++; 1153494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan no_space = false; 1154c2c9a149f127736550d7430653f4c1a51731442eSean Callanan } 1155c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1156494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX 1157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH 1158dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1159dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 1160dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 1161dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 1162dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1163dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 1164dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1165c2c9a149f127736550d7430653f4c1a51731442eSean Callanan default: 1166c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1167c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1168c2c9a149f127736550d7430653f4c1a51731442eSean Callanan break; 1169dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 1170c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1171c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1172dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 1173dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 1174dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 1175dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1177dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1178dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 1179c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1180c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1181dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 1182dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 1183dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 1184dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 1185dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1187dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 1188dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1192dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 1193dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 1196dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1197dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1321dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 1322dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 1323dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1324dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1325dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1326dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1327dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1328dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1329dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1330dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1331dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1332dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1333dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1334dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1335dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1336dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1337dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1338dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1339dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1340dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1341dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1342dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1343dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1344dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1345dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1346dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1347b01000fd063629facd45044f137446fb748ee179Greg Clayton 1348412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1349795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1350795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1351b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1352462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1353412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1354462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1355412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 13561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 13571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 135830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 135930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1360412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1361795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 13623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1363974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1364795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1365b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(ast); 1366795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1367b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 1368795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1369795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1370795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 13713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 13721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1373b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl(); 1374795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 13751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1376412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1377795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 13781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 13791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 138030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 13813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 138230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 138390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 138490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 138590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 1386d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 138790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 13885325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 138990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 139090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 1391d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 139230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 139390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 139490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 139590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 139690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 139790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 139890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 139990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1400b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast, 140190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1402279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1403b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 140490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 14058950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, 140690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 140790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 140890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1409b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (decl_name == cxx_record_decl->getDeclName()) 141030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 1411b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast, 141230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 1413279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1414b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 141530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 141630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 141730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 141830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 141930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 142030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 142130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 142290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1423dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1424dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1425dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 142690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1427dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1428dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1429b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 143090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1431279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1432b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 143490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1435dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1436dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1437279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_inline, 1438279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 1439dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1440dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1441dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1442dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1443b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast, 1444dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 1445279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1446b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1447dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1448dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1449dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1450279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_explicit, 1451279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 1452dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 145390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1454dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1455dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 145690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1457b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 145890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1459279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1460dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 146190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 146290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 146390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 146490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 1465279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_inline, 1466279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 146790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 146830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1469dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1470462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 147147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 14721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 14731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 147447a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 14753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 14763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ParmVarDecl *params[num_params]; 14783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 14803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 14813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 14823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1483b01000fd063629facd45044f137446fb748ee179Greg Clayton params[param_index] = ParmVarDecl::Create (*ast, 14841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl, 14851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 1486279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 14871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 14881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 14891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 14901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 14911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_None, 14921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL); 14933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 14943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setParams (params, num_params); 14963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 14971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 14987a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton 14997a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic()); 15007a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate()); 15017a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD()); 15027a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty()); 15037a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract()); 15047a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor()); 15057a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor()); 15067a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment()); 15077a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor()); 1508412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1509795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1510795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1511795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 151284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 151384f8075072eef306234f8109573067647735c111Greg Clayton( 1514b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1515462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 151684f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1517462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 151884f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 151984f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 152084f8075072eef306234f8109573067647735c111Greg Clayton) 152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1525b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1527b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1532d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = record_qual_type.getTypePtr(); 153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 154324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1544b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1545b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1547b01000fd063629facd45044f137446fb748ee179Greg Clayton FieldDecl *field = FieldDecl::Create (*ast, 154884f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 154984f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1550279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 155184f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 155284f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 155384f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 155484f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 155584f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155784f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 15659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1566d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 15679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 15689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 15691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 1570b01000fd063629facd45044f137446fb748ee179Greg Clayton ClangASTContext::AddObjCClassIVar (ast, 157160a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 15729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 15739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 15749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 15759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 15761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 15779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 15789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 1592b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1597b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast == NULL || field == NULL) 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 1606b01000fd063629facd45044f137446fb748ee179Greg Clayton if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast)) 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1643b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 164424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1645b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1647b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 1648b01000fd063629facd45044f137446fb748ee179Greg Clayton 1649d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr()); 1650b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_type) 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1652b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl *record_decl = record_type->getDecl(); 1653b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_decl) 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1655b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t field_idx; 1656b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl::field_iterator field, field_end; 1657b01000fd063629facd45044f137446fb748ee179Greg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 1658b01000fd063629facd45044f137446fb748ee179Greg Clayton field != field_end; 1659b01000fd063629facd45044f137446fb748ee179Greg Clayton ++field, ++field_idx) 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1661b01000fd063629facd45044f137446fb748ee179Greg Clayton // If no accessibility was assigned, assign the correct one 1662b01000fd063629facd45044f137446fb748ee179Greg Clayton if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 1663b01000fd063629facd45044f137446fb748ee179Greg Clayton field->setAccess ((AccessSpecifier)default_accessibility); 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1673462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 16766e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 16776e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 16786e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 16796e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 1680ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)), 1681ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan SourceLocation()); 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1685e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1686e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1687e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1688e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1689e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1690e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1691e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1692e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1693e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1694e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1696462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1700b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl(); 1701b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1703b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setBases(base_classes, num_base_classes); 1704b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 170984f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 171084f8075072eef306234f8109573067647735c111Greg Clayton 1711462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 171284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 171384f8075072eef306234f8109573067647735c111Greg Clayton( 171484f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 171584f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 171684f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 171784f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 171884f8075072eef306234f8109573067647735c111Greg Clayton) 171984f8075072eef306234f8109573067647735c111Greg Clayton{ 1720b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1721b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 172284f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 172384f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 1724b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 172584f8075072eef306234f8109573067647735c111Greg Clayton 172684f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 172784f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 172884f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 172984f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 173084f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 1731b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast, 173284f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 173384f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1734b01000fd063629facd45044f137446fb748ee179Greg Clayton &ast->Idents.get(name), 173584f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 173684f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 173784f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 17389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1739b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getObjCInterfaceType(decl).getAsOpaquePtr(); 174084f8075072eef306234f8109573067647735c111Greg Clayton} 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174284f8075072eef306234f8109573067647735c111Greg Claytonbool 1743462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 174484f8075072eef306234f8109573067647735c111Greg Clayton{ 174584f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 174684f8075072eef306234f8109573067647735c111Greg Clayton { 174784f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 174884f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 1749d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 1750d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *super_type = super_qual_type.getTypePtr(); 175184f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 175284f8075072eef306234f8109573067647735c111Greg Clayton { 1753d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1754d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 175584f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 175684f8075072eef306234f8109573067647735c111Greg Clayton { 175784f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 175884f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 175984f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 176084f8075072eef306234f8109573067647735c111Greg Clayton { 176184f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 176284f8075072eef306234f8109573067647735c111Greg Clayton return true; 176384f8075072eef306234f8109573067647735c111Greg Clayton } 176484f8075072eef306234f8109573067647735c111Greg Clayton } 176584f8075072eef306234f8109573067647735c111Greg Clayton } 176684f8075072eef306234f8109573067647735c111Greg Clayton } 176784f8075072eef306234f8109573067647735c111Greg Clayton return false; 176884f8075072eef306234f8109573067647735c111Greg Clayton} 176984f8075072eef306234f8109573067647735c111Greg Clayton 177084f8075072eef306234f8109573067647735c111Greg Clayton 177184f8075072eef306234f8109573067647735c111Greg Claytonbool 177284f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 177384f8075072eef306234f8109573067647735c111Greg Clayton( 1774b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1775462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 177684f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1777462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 177884f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 177984f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 17801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 178184f8075072eef306234f8109573067647735c111Greg Clayton) 178284f8075072eef306234f8109573067647735c111Greg Clayton{ 178384f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 178484f8075072eef306234f8109573067647735c111Greg Clayton return false; 178584f8075072eef306234f8109573067647735c111Greg Clayton 1786b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 178784f8075072eef306234f8109573067647735c111Greg Clayton 1788b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 178984f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 179084f8075072eef306234f8109573067647735c111Greg Clayton 179184f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 179284f8075072eef306234f8109573067647735c111Greg Clayton 1793d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 179484f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 179584f8075072eef306234f8109573067647735c111Greg Clayton { 1796d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 179784f8075072eef306234f8109573067647735c111Greg Clayton 179884f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 179984f8075072eef306234f8109573067647735c111Greg Clayton { 180084f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 180184f8075072eef306234f8109573067647735c111Greg Clayton 180284f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 180384f8075072eef306234f8109573067647735c111Greg Clayton { 180484f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 180584f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 180684f8075072eef306234f8109573067647735c111Greg Clayton { 1807b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1808b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 180984f8075072eef306234f8109573067647735c111Greg Clayton } 181084f8075072eef306234f8109573067647735c111Greg Clayton 1811b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast, 18129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 18139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 1814279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 18159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 18169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 18179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 18189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 18199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 18201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 18219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 18239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 18259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 18269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 182784f8075072eef306234f8109573067647735c111Greg Clayton } 182884f8075072eef306234f8109573067647735c111Greg Clayton } 182984f8075072eef306234f8109573067647735c111Greg Clayton } 183084f8075072eef306234f8109573067647735c111Greg Clayton return false; 183184f8075072eef306234f8109573067647735c111Greg Clayton} 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18349488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1835462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 18369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 18379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 18389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1839d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 18409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 18419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1842d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 18439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 18459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 18469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 18489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 18499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18509488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 18519488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 18529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 18539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 18549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 18569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 18579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 18599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 18609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 18619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 18629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 18651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1866462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 18671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 18681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1869b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1870462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 18711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1872462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 18731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 18741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 18751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 18761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 18771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1879b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 18801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1881b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 18821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 18831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 18851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1886d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 18871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 18881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1890d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 18911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 18931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 18961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 18971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 18981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 18991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 19011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 19021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 19051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 19061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 19081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1909ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 19101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1911ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1912ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1913ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1914ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 19151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1916ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1918ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 19196bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 19206bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1921ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 19221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 19236bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 19246bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 19301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1931b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 19331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 1937d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *method_type(method_qual_type.getTypePtr()); 19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1942d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1955b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast, 19561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 19581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 19591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 19601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 19631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 19641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 19651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 19661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 19671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 19681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 19711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 19741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 19751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 19761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 19781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1979b01000fd063629facd45044f137446fb748ee179Greg Clayton params.push_back (ParmVarDecl::Create (*ast, 19801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 19811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 1982279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 19831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 19841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 19851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 19861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 19871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 19881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 19891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1991b01000fd063629facd45044f137446fb748ee179Greg Clayton objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args); 19921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 19951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 19981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 19991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2001bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 2002f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 2003f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 2004f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 2005b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ASTContext *ast, 2006f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 2007f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 2008bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 2009bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 2010f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 2011f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2012f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2013f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 2014bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2015bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 2016bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2017bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2018bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 2019bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 202004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 202104325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 202204325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 202304325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 202404325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 2025b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast && pointee_or_element_clang_type) 2026b01000fd063629facd45044f137446fb748ee179Greg Clayton *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 202704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 2028f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2029f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 2030f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 203104325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 203204325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 2033f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2034f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 2035f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2036f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2037f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 2038f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2039e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue; 2040f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2041f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 2042f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 2043f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 2044f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 2045f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2046f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 2047f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 2048f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2049bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 2050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 2051bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 2052bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 2053f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2054f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 2055f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2056f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 2057f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 2058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2059bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 2060bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 2061bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 2062bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 2063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 2064f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2065f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2066f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2067f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2068f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 2069f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 2070f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2071bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 2072f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2073f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 2074f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2075f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2076f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 2077f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2078bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2079bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2080f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2081f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 2082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 2085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2086bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 2087bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 2088bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 2089bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2090bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 2091bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 2092bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 2093bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 2094bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 2095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2096f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 20979e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2098b01000fd063629facd45044f137446fb748ee179Greg Clayton ast, 2099f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 2100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2101bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 2102bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 2103bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2104bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 2105bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 2106bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2107bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 2108bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2109bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 21109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2114462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 212103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 212203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 21251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 21261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 21271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 21281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 21291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 21309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 21319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 213324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 21359e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 213624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 213824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 213924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 214024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 214124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 214224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 214324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2145b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes) 214624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2147b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 214824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 214924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 2151b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 21529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 21539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2155960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2156960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 2157960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 2159960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 2160960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2162960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2163960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2164960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2165960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2166960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2167c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2168e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 0; 2169c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 21701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 21717a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 217224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 217824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 218124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 218224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 22139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 22147a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 22159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2216d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 22179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 22189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 22199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 22219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 22239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 22269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 22279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 22299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 22319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 22329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 22349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 22359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 22389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 2244960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2245d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 2246960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2247b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2248b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2249960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 2250960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 2251960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 2252960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2253960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2254960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 2255960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2256960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 22579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2264d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 2265c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType pointee_type (pointer_type->getPointeeType()); 2266b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2267b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 22689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 2270c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2271c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We have a pointer to a pointee type that claims it has no children. 2272c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We will want to look at 2273c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr()); 2274c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2280f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2281f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2282f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2283d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 2284f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 2285b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2286b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2287f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 2288f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 2289f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 2290f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 2291f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2292f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 2293f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2294f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2295f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2296f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 22971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 2298b01000fd063629facd45044f137446fb748ee179Greg Clayton num_children = ClangASTContext::GetNumChildren (ast, 2299b01000fd063629facd45044f137446fb748ee179Greg Clayton cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2300b01000fd063629facd45044f137446fb748ee179Greg Clayton omit_empty_base_classes); 230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2309c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no 2310c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a 2311c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer, 2312c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type 2313c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show. 2314c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t 2315c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type) 2316c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{ 2317c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (clang_type == NULL) 2318c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2319c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2320c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2321c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2322c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton switch (type_class) 2323c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 23249db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::Type::Builtin: 23259db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 23269db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton { 2327abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton case clang::BuiltinType::UnknownAny: 23289db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Void: 23299db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::NullPtr: 23309db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 0; 23319db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Bool: 23329db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_U: 23339db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UChar: 2334ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_U: 23359db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char16: 23369db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char32: 23379db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UShort: 23389db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt: 23399db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULong: 23409db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULongLong: 23419db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt128: 23429db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_S: 23439db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::SChar: 2344ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_S: 23459db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Short: 23469db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int: 23479db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Long: 23489db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongLong: 23499db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int128: 23509db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Float: 23519db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Double: 23529db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongDouble: 23539db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Dependent: 23549db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Overload: 23559db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCId: 23569db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCClass: 23579db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCSel: 23580de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan case clang::BuiltinType::BoundMember: 23599db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 1; 23609db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton } 23619db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton break; 23629db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 2363e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 1; 2364c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Pointer: return 1; 2365c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 2366c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::LValueReference: return 1; 2367c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::RValueReference: return 1; 2368c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::MemberPointer: return 0; 2369c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ConstantArray: return 0; 2370c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::IncompleteArray: return 0; 2371c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::VariableArray: return 0; 2372c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedArray: return 0; 2373c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedExtVector: return 0; 2374c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Vector: return 0; 2375c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ExtVector: return 0; 2376c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 2377c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 2378c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2379c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Paren: return 0; 2380c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2381c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOfExpr: return 0; 2382c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOf: return 0; 2383c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Decltype: return 0; 2384c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Record: return 0; 2385c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Enum: return 1; 2386c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Elaborated: return 1; 2387c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateTypeParm: return 1; 2388c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::SubstTemplateTypeParm: return 1; 2389c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateSpecialization: return 1; 2390c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::InjectedClassName: return 0; 2391c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentName: return 1; 2392c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentTemplateSpecialization: return 1; 2393c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObject: return 0; 2394c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCInterface: return 0; 2395c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObjectPointer: return 1; 2396c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2397c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton break; 2398c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2399c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2400c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton} 240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2402462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2406462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 240824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 240924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 241024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 241124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 241224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 241324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2414bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 241500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 241600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 241724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 241824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 242024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetChildClangTypeAtIndex (getASTContext(), 242224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 242424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 242524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 242624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 242724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 242824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 243024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2431bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 243200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 243300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 243424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 243524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 243624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2437462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 243824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 243924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 2440b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 244124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2442462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 244324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 244424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 244524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 244624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2450bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 245100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 245200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 245424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2458b01000fd063629facd45044f137446fb748ee179Greg Clayton if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes)) 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2463bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 246503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 246603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2468960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2469960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2470960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2471960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2472960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 247304325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 2474b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT; 2475b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 2476960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2477960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2478960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2479960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2480960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2481960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 24821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 24837a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 248624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 2488b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl); 248924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 249024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 249224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 250124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 250824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 251324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 2517a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 251824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 2519a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 252024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 252224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 252324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 252424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string base_class_type_name(base_class->getType().getAsString()); 252524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 252624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(base_class_type_name.c_str()); 252724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2528b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25309994a0bcfe1790b320f6a9cf51c8d5ac9c4efdbdJim Ingham // Base classes bit sizes should be a multiple of 8 bits in size 253124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 253224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2533bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 253824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 2554b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType()); 255554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 2562b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size)) 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 25729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 25737a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 25749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2575d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 25769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 25779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 25789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 25809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 25819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 25839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2585b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl); 25869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 25879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 25889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 25909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2591b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 25929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 25939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 25949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2595b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl)); 25969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 25989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 25999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2600b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 26019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2603960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2604bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 26059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 26079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 26139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2615960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2616960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 26179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 26199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 26219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 26239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 26259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 26279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 26299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 26319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2632b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 26339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 26359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 2637960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 26389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_offset = bit_offset / 8; 26399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 26419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 26499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 26519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2652d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2653960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2654960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2655960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2656960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 265700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 265800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 2659b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 2660960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2661960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2662960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2663960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2664960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2665960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2666960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2667960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2668960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2669bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 267000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 267100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2672960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2673960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2674960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 267500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 2676960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2677960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2678960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2679960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2680960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2681960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2682960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2683960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2684960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2685b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2686960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2687960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2688960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2689960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2690960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2691960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 26929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 26949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2702b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetCompleteQualType (ast, array->getElementType())) 2703b01000fd063629facd45044f137446fb748ee179Greg Clayton { 2704b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2706b01000fd063629facd45044f137446fb748ee179Greg Clayton char element_name[64]; 2707b01000fd063629facd45044f137446fb748ee179Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2709b01000fd063629facd45044f137446fb748ee179Greg Clayton child_name.assign(element_name); 2710b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(field_type_info.first % 8 == 0); 2711b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = field_type_info.first / 8; 2712b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_offset = idx * child_byte_size; 2713b01000fd063629facd45044f137446fb748ee179Greg Clayton return array->getElementType().getAsOpaquePtr(); 2714b01000fd063629facd45044f137446fb748ee179Greg Clayton } 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2721d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 27239db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 27249db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton // Don't dereference "void *" pointers 27259db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (pointee_type->isVoidType()) 27269db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return NULL; 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 273000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 273100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 2732b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2742bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 274300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 274400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 274800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 274900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2759b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2769f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2770f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2771f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2772d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2773f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2774f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2775f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2776f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 277700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 277800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 2779b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 2780f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2781f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2782f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2783f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2784f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 2785f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2786f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2787f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2788f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2789f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 279000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 279100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2792f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2793f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2798f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2799f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2800f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2801f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2802f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2803f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2804b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2805f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2806f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2809f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2810f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2811f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2813f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 28141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 2815b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetChildClangTypeAtIndex (ast, 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 28179e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 281824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2825bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 282600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 282700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2834f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 283924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2840b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false; 284124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 284424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 284924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 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 // Skip empty base classes 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 286924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 287324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 287524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 287624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 287924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 288324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 288524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 288624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 288724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 289724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 289824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 289924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 290624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3014b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3015462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 302403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 302503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 30287a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 3061b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name)); 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 308624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 310024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 31169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 31177a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 31189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 3120d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 31219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 31229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 31239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 31259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 31269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 31289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 31309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 31319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3132823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 31339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 31359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 31379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 31399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 31409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 31419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 31439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 31449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 31489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 31509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 31519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 31529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 31539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3154b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetIndexOfChildMemberWithName (ast, 3155b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 31569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 31579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 31589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 31599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 31619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 31629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 31639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 31669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 31679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 31689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 31699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 31749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 31769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3177b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 31789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 31799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 31809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 31819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 31829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 31839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 31849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 318724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 318824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 318924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 319024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 319124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 319224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3193b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 319424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 319524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 319624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 319724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 319824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 319924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 320024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 320124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 320224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 320324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 320424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 320524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 320624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 320824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 320924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 321024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 321124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 321224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 321324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3214b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 321524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 321624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 321724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 321824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 321924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 322024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 32211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 32221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 322324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3224d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 322524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 322624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 322724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 322824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3229b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 323024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 323124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 323224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 323324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 323424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 323624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 323724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 323924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3240d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 324124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 324224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 324324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 324424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3245b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 324624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 324824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 324924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 325024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 325124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 325224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 325324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 325424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 325524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 325624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 325724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 325824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3262b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 326524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3273b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 32749e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 327724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 327924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 329324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3294b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3295462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 329624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 330124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 33039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 330403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 33059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 330603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 33097a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 331024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 331224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->getType().getAsString().compare (name) == 0) 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 333424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 334424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 334524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 334624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 33529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 33537a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 33549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 3356d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 33579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 33589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 33599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 33619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 33629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 33649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 33669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 33679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 33699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 33719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 33739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 33759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 33769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 33779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 33799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 33839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 33849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 33859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 33869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 33919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 33929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 33939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3394b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 33959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 33969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 33979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 33989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 33999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 34009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 340324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 340424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3408b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 342424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 342524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 342624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 342724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 342824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3429b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 343024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 343124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 343224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 343324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 343424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 343524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 34361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 34371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 343824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3439d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 344024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 344124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 344224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 344324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3444b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 344524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 344624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 344724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 344824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 344924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 345024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 345124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 345324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3454d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 345524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 345624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 345724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 345824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3459b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 346024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 346124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 346224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 346324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 346424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 346524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 346624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 346724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 346824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 346924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 347024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 347124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 347224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 347324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 347424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3475b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 348124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3486b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 34879e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 349124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 349524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 349924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3501462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 350224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 350324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 350524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 3506d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = tag_qual_type.getTypePtr(); 350724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3509d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const TagType *tag_type = dyn_cast<TagType>(clang_type); 351024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 351224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 351724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 352724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3528462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 353224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 353403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 353503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 35389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 35399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 35409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 35419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 3542279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentSizedArray: break; 35439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 3544279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentSizedExtVector: break; 35459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 35469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 35479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 35489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 35499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 35509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 35519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 35529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 35539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 35549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 35559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 35569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 35579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 35589e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 35599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 35609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 35619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 35629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 35639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 35649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 3565279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentTemplateSpecialization: break; 3566279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::TemplateTypeParm: break; 3567279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::SubstTemplateTypeParm: break; 3568279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::SubstTemplateTypeParmPack:break; 3569279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::PackExpansion: break; 3570279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::UnresolvedUsing: break; 3571279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Paren: break; 3572279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Elaborated: break; 3573279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Attributed: break; 3574279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Auto: break; 3575279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::InjectedClassName: break; 3576279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentName: break; 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 357924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3591b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 3593b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 3594279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name)); 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 360124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3603462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3607b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3608b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 361024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 361124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3612b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3613b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 361424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3615279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 3616b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationName (&ast->Idents.get(name)), 361724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 361824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 361924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 362024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 362124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 362224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 362324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 362424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3625b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3626b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 362724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3628279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 362924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 363024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 363124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 363224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 363324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 363424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 363524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 363724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 363824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 363924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3640462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3641b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast, 3642462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3643462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 36442ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 36452ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 36462ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 364724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3648b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 364924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 3654ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan FunctionProtoType::ExtProtoInfo proto_info; 3655ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Variadic = is_variadic; 3656279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan proto_info.ExceptionSpecType = EST_None; 3657ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.TypeQuals = type_quals; 3658279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan proto_info.RefQualifier = RQ_None; 3659ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.NumExceptions = 0; 3660ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Exceptions = NULL; 3661ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan 3662b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getFunctionType(QualType::getFromOpaquePtr(result_type), 366353d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 366424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 3665ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info).getAsOpaquePtr(); // NoReturn); 366624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 366724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3669462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3671b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3672b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 3673b01000fd063629facd45044f137446fb748ee179Greg Clayton return ParmVarDecl::Create(*ast, 3674b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3676279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 3677b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL, 36782ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 368024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 368124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 368524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 368624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 368724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 368824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 368924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 369024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 369424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3695462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3696462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 369824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 369924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3700b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3701b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 3703b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 370624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 371324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3715462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 371624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 371724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 371824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 371924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3720d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *t = qual_type.getTypePtr(); 372124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3723d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const TagType *tag_type = dyn_cast<TagType>(t); 372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 372724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 372824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 372924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 373024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 373124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 373524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 373624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 373824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3739462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 374224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 374455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 374555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 374655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 374755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 374955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 375055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 375155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 375255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 375355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3754d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 375504325065a00f646527db85e9bc751da29ac53b23Sean Callanan 375604325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 375704325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 375804325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 375904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 376004325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 376104325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 376204325065a00f646527db85e9bc751da29ac53b23Sean Callanan 376355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 376455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 376555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 376655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 376755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 376855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 376955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 377155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 377255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 377355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 377455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 377555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3776b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 377748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 377848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 377948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 378048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 3781b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) 378248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 378348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 3784b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->IntTy; 378548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 3786b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->UnsignedIntTy; 378748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 378848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 378948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 379048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 379148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 379255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 379324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 379624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3802462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 38030d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType 38040d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton( 38050d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const char *name, 38060d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton DeclContext *decl_ctx, 38070d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const Declaration &decl, 38080d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton clang_type_t integer_qual_type 38090d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton) 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 381224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3813b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3814b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 381548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 381648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 381748fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 381848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 381948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 3820b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast, 38210d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton decl_ctx, 382248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 382348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 3824279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan name && name[0] ? &ast->Idents.get(name) : NULL, 38259e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan NULL, 38269e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScoped 38279e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScopedUsingClassTag 38289e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false); // IsFixed 3829864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3830864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 383124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3832e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3833e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3834e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 3835864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3836864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan enum_decl->setAccess(AS_public); // TODO respect what's in the debug info 3837864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3838b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(enum_decl).getAsOpaquePtr(); 3839e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 384024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 384124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 384224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3843462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3844462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3845462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3846462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3847462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3848d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = enum_qual_type.getTypePtr(); 3849462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3850462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3851462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3852462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3853462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3854462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3855462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3856462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3857462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3858462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3859462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3860462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 386124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 386224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 386324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3864462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3865462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 386924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 387424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 387524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3876b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 387724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 387824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3879b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 388024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 388124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 388224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3883d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = enum_qual_type.getTypePtr(); 388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 388624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 388724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 388924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 389024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 389124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 389224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 3893b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumConstantDecl::Create (*ast, 3894b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_type->getDecl(), 3895b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 3896b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 3897b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType::getFromOpaquePtr(enumerator_clang_type), 3898b01000fd063629facd45044f137446fb748ee179Greg Clayton NULL, 3899b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_llvm_apsint); 3900b01000fd063629facd45044f137446fb748ee179Greg Clayton 390124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 390224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 390324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 390524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 390924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 391024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 391124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3914462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3915462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 391624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3917427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return CreatePointerType (getASTContext(), clang_type); 3918427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t 3921427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type) 3922427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3923427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 39247b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 39257b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 39267b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 392703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 392803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 39297b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 39307b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 39317b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 3932427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 39337b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 39347b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 3935427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getPointerType(qual_type).getAsOpaquePtr(); 39367b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 39377b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 393824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3941462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 39426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast, 39436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 39466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 394724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 394924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3950462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 39516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast, 39526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 39556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 395624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3959462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3960462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3961fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 3962fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 3963fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3964fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3965fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 3966fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 3967fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 3968bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t 396924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 397024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3971b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3972b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypeSize(ast->VoidPtrTy); 397324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3976462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 398203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 398303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 398504325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 398604325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 398704325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 398804325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 398904325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 399004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 399104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 399204325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 399304325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 399404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 39951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 399624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 399724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 399824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 39991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 400024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 400124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 400224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 400424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 400524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 400624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 400824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 400924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 401024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 401424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 401624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 40209e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 402324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 402424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 402524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 402624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4028462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 402924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 403224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 403424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 403524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 403624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 403724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 403824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 403924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 404024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 404524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4048462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 404924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 405024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 405124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 405224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 405303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 405403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 405524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 405604325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 405704325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 405804325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 405904325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 406004325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 406104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 406204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 406304325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 406404325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 406504325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 40661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 406724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 406824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 406924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 407124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 407224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 407324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 407524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 407624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 407724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 407924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 408024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 408124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 40839e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type); 408424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 408524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 408624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 408724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 408824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 408924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 409024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4092462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 409324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 409424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 409524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 409624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 409724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 409824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 409924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 410024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 410124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 410224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 410324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 410424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 410524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 410624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 410724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 410824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 410924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 411024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 411124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 411224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 411324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 411424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 411524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 411624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 411724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 411824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 411924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 412024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 412124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 412224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 412324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 412424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 412524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 412624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 412724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 412824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 412924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4130bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4131bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 4132bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 4133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 4134bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 4135bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4136bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4137bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4138bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 4139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 4140bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 4142bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 4143bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4144bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4145bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 4146bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 4147bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 4148bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4149bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 41501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4151462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 41521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 41531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 41541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 41551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 41561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 41571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 41581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 41591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 41601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 41611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 41621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4163462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 41641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 41651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 41661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 41671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 41681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 41691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 41701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 41711d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 41721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 41731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 41741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 4175f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 4176f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 4177f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4178f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4179f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 4180f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4181f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 418224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 418324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4184462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 418524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4186f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 4187f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 4188f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4189f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 4190f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4191f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4192f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 419324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4194f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 4195f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4196f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 419724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4198f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4199f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 420024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4201f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 4202f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 4203f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 4204f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 420524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4206f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 420724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4208f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 4209f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 421024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 421124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 421224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 421324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 421424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 421524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 421624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 421724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4218462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 421903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 422003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 422103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 422203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 422303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 422403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 422503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 422603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 422703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 422803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 422903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 4230279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan default: 4231279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 423203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 42339e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 423403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 423503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 423603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 423703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 4238d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 423903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 424003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 424103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 424203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 424303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 424403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 424503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 424603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 424703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 4248f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 4249f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 4250f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4251f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4252f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 4253d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 4254f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (array) 4255f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return array->getSize().getLimitedValue(); 4256f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 4257f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 4258f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 425903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 426003e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 4261462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 426224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 426324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 426424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 426524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 426624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 426724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 426803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 426903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 427024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4271279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan default: 4272279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 42731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 427424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 427524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 427624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 4277381f968161e2274c55706ead0baed444a26b5092Greg Clayton *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX); 427824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 42791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 428024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 428124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 428224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 428324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 428424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 42851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 428624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 428724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 428824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 428924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 42905aad3f5581aec9ee62277d92b11cba7abf837dbdGreg Clayton return true; 42911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 429224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 429324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 429424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 429524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 429624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 429724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 429824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 429924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 430024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 430124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 430224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 430324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4304462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4305462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 430624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 430724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 430824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4310b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 4312b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 431324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 431424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 4315b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 4316b01000fd063629facd45044f137446fb748ee179Greg Clayton TypedefDecl *decl = TypedefDecl::Create (*ast, 4317b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx, 4318b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 4319279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 4320b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 4321b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->CreateTypeSourceInfo(qual_type)); 4322864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 4323864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan decl->setAccess(AS_public); // TODO respect proper access specifier 432424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 432524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 4326b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypedefType (decl).getAsOpaquePtr(); 432724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 433124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 433224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstd::string 4333462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 433524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string return_name; 433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4337462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4339462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (typedef_type) 434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43420de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan const TypedefNameDecl *typedef_decl = typedef_type->getDecl(); 434324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = typedef_decl->getQualifiedNameAsString(); 434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 434724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_name = qual_type.getAsString(); 434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 434924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_name; 435124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 435224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 4360b01000fd063629facd45044f137446fb748ee179Greg 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) 436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 437324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 437424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 437524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 437624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 437724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 437824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 438024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 438124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 438524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 438624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 438824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 438924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 439024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 439124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 439224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 439324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 439424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 4395b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 439624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 439724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 439824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 440224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 440324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 440624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 4409b01000fd063629facd45044f137446fb748ee179Greg Clayton APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref); 441024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4411b01000fd063629facd45044f137446fb748ee179Greg Clayton const uint64_t bit_size = ast->getTypeSize (qual_type); 441224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 441424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 441524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 441824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 442224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 442424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 442524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 442624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 443024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 443124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4432a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4433a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 4434462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 4435a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 4436a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 4437a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4438a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4439a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4440a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 4441a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 4442b01000fd063629facd45044f137446fb748ee179Greg Clayton 4443b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4444b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type) 4445b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4446b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 4447b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 4448b01000fd063629facd45044f137446fb748ee179Greg Clayton 44497a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type)); 4450b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4451b01000fd063629facd45044f137446fb748ee179Greg Clayton 4452b01000fd063629facd45044f137446fb748ee179Greg Clayton 4453b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4454b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type) 4455b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4456b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::GetCompleteType (getASTContext(), clang_type); 4457b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4458b01000fd063629facd45044f137446fb748ee179Greg Clayton 4459