ClangASTContext.cpp revision b302b2f50e079b11a12ebafc29104c198f4f15e4
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" 6158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/ExecutionContext.h" 6258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/Process.h" 6358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/ObjCLanguageRuntime.h" 6458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h> 67f05633b35544b5d095feb05680c8728be087e441Eli Friedman 68585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb; 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm; 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73b01000fd063629facd45044f137446fb748ee179Greg Clayton 74b01000fd063629facd45044f137446fb748ee179Greg Claytonstatic bool 75b01000fd063629facd45044f137446fb748ee179Greg ClaytonGetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type) 76b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 77b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 78b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 79b01000fd063629facd45044f137446fb748ee179Greg Clayton { 80b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 81b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 82b01000fd063629facd45044f137446fb748ee179Greg Clayton { 83d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr()); 84b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_type) 85b01000fd063629facd45044f137446fb748ee179Greg Clayton { 86b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::TagDecl *tag_decl = tag_type->getDecl(); 87b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl) 88b01000fd063629facd45044f137446fb748ee179Greg Clayton { 89b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl->getDefinition()) 90b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 91b01000fd063629facd45044f137446fb748ee179Greg Clayton 92b01000fd063629facd45044f137446fb748ee179Greg Clayton if (tag_decl->hasExternalLexicalStorage()) 93b01000fd063629facd45044f137446fb748ee179Greg Clayton { 9482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (ast) 95b01000fd063629facd45044f137446fb748ee179Greg Clayton { 9682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 9782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (external_ast_source) 9882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 9982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton external_ast_source->CompleteType(tag_decl); 10082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return !tag_type->isIncompleteType(); 10182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 102b01000fd063629facd45044f137446fb748ee179Greg Clayton } 103b01000fd063629facd45044f137446fb748ee179Greg Clayton } 104b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 105b01000fd063629facd45044f137446fb748ee179Greg Clayton } 106b01000fd063629facd45044f137446fb748ee179Greg Clayton } 107b01000fd063629facd45044f137446fb748ee179Greg Clayton 108b01000fd063629facd45044f137446fb748ee179Greg Clayton } 109b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 110b01000fd063629facd45044f137446fb748ee179Greg Clayton 111b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 112b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 113b01000fd063629facd45044f137446fb748ee179Greg Clayton { 114d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type); 115b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 116b01000fd063629facd45044f137446fb748ee179Greg Clayton { 117b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 118b01000fd063629facd45044f137446fb748ee179Greg Clayton // We currently can't complete objective C types through the newly added ASTContext 119b01000fd063629facd45044f137446fb748ee179Greg Clayton // because it only supports TagDecl objects right now... 120b01000fd063629facd45044f137446fb748ee179Greg Clayton bool is_forward_decl = class_interface_decl->isForwardDecl(); 121b01000fd063629facd45044f137446fb748ee179Greg Clayton if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage()) 122b01000fd063629facd45044f137446fb748ee179Greg Clayton { 12382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (ast) 124b01000fd063629facd45044f137446fb748ee179Greg Clayton { 12582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 12682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (external_ast_source) 12782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 12882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton external_ast_source->CompleteType (class_interface_decl); 12982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton is_forward_decl = class_interface_decl->isForwardDecl(); 13082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 131b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1327a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return is_forward_decl == false; 133b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1347a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return true; 135b01000fd063629facd45044f137446fb748ee179Greg Clayton } 136b01000fd063629facd45044f137446fb748ee179Greg Clayton } 137b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 138b01000fd063629facd45044f137446fb748ee179Greg Clayton 139b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 140b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()); 141b01000fd063629facd45044f137446fb748ee179Greg Clayton 142b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 143b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 144b01000fd063629facd45044f137446fb748ee179Greg Clayton } 145b01000fd063629facd45044f137446fb748ee179Greg Clayton 146b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 147b01000fd063629facd45044f137446fb748ee179Greg Clayton} 148b01000fd063629facd45044f137446fb748ee179Greg Clayton 149b01000fd063629facd45044f137446fb748ee179Greg Clayton 15084f8075072eef306234f8109573067647735c111Greg Claytonstatic AccessSpecifier 151585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToAccessSpecifier (AccessType access) 15284f8075072eef306234f8109573067647735c111Greg Clayton{ 15384f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 15484f8075072eef306234f8109573067647735c111Greg Clayton { 155585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 156585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return AS_none; 157585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return AS_public; 158585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return AS_private; 159585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return AS_protected; 16084f8075072eef306234f8109573067647735c111Greg Clayton } 16184f8075072eef306234f8109573067647735c111Greg Clayton return AS_none; 16284f8075072eef306234f8109573067647735c111Greg Clayton} 16384f8075072eef306234f8109573067647735c111Greg Clayton 16484f8075072eef306234f8109573067647735c111Greg Claytonstatic ObjCIvarDecl::AccessControl 165585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 16684f8075072eef306234f8109573067647735c111Greg Clayton{ 16784f8075072eef306234f8109573067647735c111Greg Clayton switch (access) 16884f8075072eef306234f8109573067647735c111Greg Clayton { 169585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton default: break; 170585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessNone: return ObjCIvarDecl::None; 171585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 172585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 173585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 174585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 17584f8075072eef306234f8109573067647735c111Greg Clayton } 17684f8075072eef306234f8109573067647735c111Greg Clayton return ObjCIvarDecl::None; 17784f8075072eef306234f8109573067647735c111Greg Clayton} 17884f8075072eef306234f8109573067647735c111Greg Clayton 17984f8075072eef306234f8109573067647735c111Greg Clayton 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangOptions &Opts, 184e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton InputKind IK 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Cleanup per-file based stuff. 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set some properties which depend soley on the input kind; it would be nice 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to move these to the language standard, and have the driver resolve the 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // input kind + language standard. 192e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton if (IK == IK_Asm) { 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AsmPreprocessor = 1; 194e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton } else if (IK == IK_ObjC || 195e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_ObjCXX || 196e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjC || 197e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton IK == IK_PreprocessedObjCXX) { 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ObjC1 = Opts.ObjC2 = 1; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStandard::Kind LangStd = LangStandard::lang_unspecified; 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_unspecified) { 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Based on the base language, pick one. 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (IK) { 206e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_None: 207e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_AST: 208279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case IK_LLVM_IR: 209b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (!"Invalid input kind!"); 210e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_OpenCL: 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_opencl; 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 213279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case IK_CUDA: 214279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan LangStd = LangStandard::lang_cuda; 215279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 216e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_Asm: 217e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_C: 218e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedC: 219e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjC: 220e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjC: 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnu99; 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 223e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_CXX: 224e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedCXX: 225e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_ObjCXX: 226e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton case IK_PreprocessedObjCXX: 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LangStd = LangStandard::lang_gnucxx98; 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.BCPLComment = Std.hasBCPLComments(); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.C99 = Std.isC99(); 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus = Std.isCPlusPlus(); 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Digraphs = Std.hasDigraphs(); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUMode = Std.isGNUMode(); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.GNUInline = !Std.isC99(); 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.HexFloats = Std.hasHexFloats(); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.ImplicitInt = Std.hasImplicitInt(); 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL has some additional defaults. 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (LangStd == LangStandard::lang_opencl) { 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OpenCL = 1; 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.AltiVec = 1; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.CXXOperatorNames = 1; 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.LaxVectorConversions = 1; 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // OpenCL and C++ both have bool, true, false keywords. 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Opts.CPlusPlus) 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fobjc_gc_only)) 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::GCOnly); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Args.hasArg(OPT_fobjc_gc)) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setGCMode(LangOptions::HybridGC); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_print_ivar_layout)) 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCGCBitmapPrint = 1; 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_faltivec)) 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AltiVec = 1; 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_pthread)) 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.POSIXThreads = 1; 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "default"); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Vis == "default") 2748950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan Opts.setVisibilityMode(DefaultVisibility); 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "hidden") 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Hidden); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else if (Vis == "protected") 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.setVisibilityMode(LangOptions::Protected); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// else 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is specified, or -std is set to a conforming mode. 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.Trigraphs = !Opts.GNUMode; 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_trigraphs)) 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Trigraphs = 1; 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fno_dollars_in_identifiers, 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// !Opts.AsmPreprocessor); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.LaxVectorConversions = 0; 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Blocks = Args.hasArg(OPT_fblocks); 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCConstantStringClass = getLastArgValue(Args, 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// OPT_fconstant_string_class); 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Static = Args.hasArg(OPT_static_define); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.OptimizeSize = 0; 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Eliminate this dependency. 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned Opt = 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Opts.Optimize = Opt != 0; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unsigned Opt = 0; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is the __NO_INLINE__ define, which just depends on things like the 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // optimization level and -fno-inline, not actually whether the backend has 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // inlining enabled. 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This is affected by other options (-fno-inline). 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Opts.NoInline = !Opt; 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// switch (SSP) { 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// default: 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Diags.Report(diag::err_drv_invalid_value) 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 348e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 349b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) : 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple(), 351b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap(), 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap(), 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap(), 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap(), 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap(), 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap(), 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap(), 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap(), 359b01000fd063629facd45044f137446fb748ee179Greg Clayton m_builtins_ap(), 360b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_tag_decl (NULL), 361b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_objc_decl (NULL), 362b01000fd063629facd45044f137446fb748ee179Greg Clayton m_callback_baton (NULL) 363b01000fd063629facd45044f137446fb748ee179Greg Clayton 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_triple && target_triple[0]) 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign (target_triple); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext() 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 382b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear() 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 389b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(); 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(); 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_source_manager_ap.reset(); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_diagnostic_ap.reset(); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset(); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset(); 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset(); 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset(); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple () 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_triple.c_str(); 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple) 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_triple.assign(target_triple); 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid 414395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch) 415395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 416395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton Clear(); 417395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton m_target_triple.assign(arch.GetTriple().str()); 418395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 419395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 420b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 421b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource () 422b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 423b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 424b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 425b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getExternalSource () != NULL; 426b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 427b01000fd063629facd45044f137446fb748ee179Greg Clayton} 428b01000fd063629facd45044f137446fb748ee179Greg Clayton 429b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 430b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap) 431b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 432b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 433b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 434b01000fd063629facd45044f137446fb748ee179Greg Clayton { 435b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (ast_source_ap); 436b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true); 437b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true); 438b01000fd063629facd45044f137446fb748ee179Greg Clayton } 439b01000fd063629facd45044f137446fb748ee179Greg Clayton} 440b01000fd063629facd45044f137446fb748ee179Greg Clayton 441b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 442b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource () 443b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 444b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 445b01000fd063629facd45044f137446fb748ee179Greg Clayton 446b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 447b01000fd063629facd45044f137446fb748ee179Greg Clayton { 448b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap; 449b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->setExternalSource (empty_ast_source_ap); 450b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false); 451b01000fd063629facd45044f137446fb748ee179Greg Clayton //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false); 452b01000fd063629facd45044f137446fb748ee179Greg Clayton } 453b01000fd063629facd45044f137446fb748ee179Greg Clayton} 454b01000fd063629facd45044f137446fb748ee179Greg Clayton 455b01000fd063629facd45044f137446fb748ee179Greg Clayton 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext * 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext() 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 460b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get() == NULL) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 462b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap.reset(new ASTContext (*getLanguageOptions(), 463b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSourceManager(), 464b01000fd063629facd45044f137446fb748ee179Greg Clayton *getTargetInfo(), 465b01000fd063629facd45044f137446fb748ee179Greg Clayton *getIdentifierTable(), 466b01000fd063629facd45044f137446fb748ee179Greg Clayton *getSelectorTable(), 467b01000fd063629facd45044f137446fb748ee179Greg Clayton *getBuiltinContext(), 468b01000fd063629facd45044f137446fb748ee179Greg Clayton 0)); 469887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 470b01000fd063629facd45044f137446fb748ee179Greg Clayton if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton) 471b01000fd063629facd45044f137446fb748ee179Greg Clayton { 472b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage(); 473b01000fd063629facd45044f137446fb748ee179Greg Clayton //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage(); 474b01000fd063629facd45044f137446fb748ee179Greg Clayton } 475b01000fd063629facd45044f137446fb748ee179Greg Clayton 476b01000fd063629facd45044f137446fb748ee179Greg Clayton m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false); 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 478b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap.get(); 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context * 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext() 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_builtins_ap.get() == NULL) 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_builtins_ap.get(); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable * 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable() 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_identifier_table_ap.get() == NULL) 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_identifier_table_ap.get(); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions * 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions() 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_language_options_ap.get() == NULL) 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_language_options_ap.reset(new LangOptions()); 503e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 504e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_language_options_ap.get(); 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable * 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable() 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_selector_table_ap.get() == NULL) 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_selector_table_ap.reset (new SelectorTable()); 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_selector_table_ap.get(); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5178a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager * 5188a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager() 5198a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{ 5208a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan if (m_file_manager_ap.get() == NULL) 52122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton { 52222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton clang::FileSystemOptions file_system_options; 52322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_file_manager_ap.reset(new clang::FileManager(file_system_options)); 52422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton } 5258a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan return m_file_manager_ap.get(); 5268a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan} 5278a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan 5281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager * 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager() 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_source_manager_ap.get() == NULL) 53222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager())); 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_source_manager_ap.get(); 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDiagnostic * 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getDiagnostic() 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_diagnostic_ap.get() == NULL) 540eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton { 541eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs()); 542eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton m_diagnostic_ap.reset(new Diagnostic(diag_id_sp)); 543eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton } 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_diagnostic_ap.get(); 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 547887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananclass NullDiagnosticClient : public DiagnosticClient 548887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 549887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic: 550887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan NullDiagnosticClient () 551887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 552887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 553887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 554887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 555887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 556887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 557887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_log) 558887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan { 559887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan llvm::SmallVectorImpl<char> diag_str(10); 560887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan info.FormatDiagnostic(diag_str); 561887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan diag_str.push_back('\0'); 562887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 563887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 564887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan } 565887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate: 566887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan LogSP m_log; 567887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}; 568887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 569887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananDiagnosticClient * 570887d25180c9ebe10513654baa96bfb31f7f1f260Sean CallananClangASTContext::getDiagnosticClient() 571887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 572887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan if (m_diagnostic_client_ap.get() == NULL) 573887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan m_diagnostic_client_ap.reset(new NullDiagnosticClient); 574887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 575887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan return m_diagnostic_client_ap.get(); 576887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan} 577887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions * 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions() 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap.reset (new TargetOptions()); 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_options_ap.get()) 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_options_ap->Triple = m_target_triple; 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_options_ap.get(); 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo * 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo() 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // target_triple should be something like "x86_64-apple-darwin10" 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_target_info_ap.get(); 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 603b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 605b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t qual_type_bit_size = ast->getTypeSize(qual_type); 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (qual_type_bit_size == bit_size) 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 611462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 612585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 614b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 616b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 618b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size); 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 621462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 622b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 624b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (encoding) 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 629585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingInvalid: 630b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 631b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 634585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingUint: 635b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 636b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 637b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 638b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 639b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 640b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 641b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 642b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 643b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 644b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 645b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 646b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 649585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingSint: 650b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 651b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 652b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 653b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 654b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 655b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 656b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 657b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 658b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 659b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 660b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 661b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 664585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingIEEE754: 665b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 666b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 667b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 668b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 669b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 670b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 673585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton case eEncodingVector: 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 681462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 684b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner #define streq(a,b) strcmp(a,b) == 0 687b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 688b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast) 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (dw_ate) 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_address: 696b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 697b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidPtrTy.getAsOpaquePtr(); 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_boolean: 701b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy)) 702b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->BoolTy.getAsOpaquePtr(); 703b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 704b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 705b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 706b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 707b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 708b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 711e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case DW_ATE_lo_user: 712e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton // This has been seen to mean DW_AT_complex_integer 7139353338e34d711856c80754721fe425bc765c6f3Greg Clayton if (::strstr(type_name, "complex")) 714e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 715e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2); 716b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr(); 717e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 718e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton break; 719e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_complex_float: 721b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy)) 722b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatComplexTy.getAsOpaquePtr(); 723b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy)) 724b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleComplexTy.getAsOpaquePtr(); 725b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy)) 726b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleComplexTy.getAsOpaquePtr(); 727e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton else 728e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 729e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2); 730b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr(); 731e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_float: 735b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 736b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->FloatTy.getAsOpaquePtr(); 737b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 738b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->DoubleTy.getAsOpaquePtr(); 739b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 740b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongDoubleTy.getAsOpaquePtr(); 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed: 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7468ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 748b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 749b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7518ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 753b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 754b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7568ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 758b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 759b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7618ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 763b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 764b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 765b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 766b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7688ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 7698ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 770b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 771b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 772b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 773b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 7748ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 7758ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (streq(type_name, "wchar_t")) 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 777b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy)) 778b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->WCharTy.getAsOpaquePtr(); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7807bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton else if (streq(type_name, "void")) 7817bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton { 7827bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy)) 7837bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton return ast->VoidTy.getAsOpaquePtr(); 7847bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton } 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 787b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 788b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 789b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 790b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ShortTy.getAsOpaquePtr(); 791b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 792b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->IntTy.getAsOpaquePtr(); 793b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 794b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongTy.getAsOpaquePtr(); 795b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 796b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->LongLongTy.getAsOpaquePtr(); 797b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 798b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->Int128Ty.getAsOpaquePtr(); 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_signed_char: 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (streq(type_name, "signed char")) 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 806b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 807b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 810b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 811b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->CharTy.getAsOpaquePtr(); 812b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 813b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->SignedCharTy.getAsOpaquePtr(); 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned: 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (type_name) 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8198ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton if (strstr(type_name, "long long")) 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 821b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 822b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8248ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "long")) 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 826b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 827b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "short")) 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 831b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 832b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8348ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "char")) 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 836b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 837b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8398ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton else if (strstr(type_name, "int")) 8408ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton { 841b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 842b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 843b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 844b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 8458ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton } 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to match up a type name, just search by size 848b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 849b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 850b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 851b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 852b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 853b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedIntTy.getAsOpaquePtr(); 854b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 855b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongTy.getAsOpaquePtr(); 856b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 857b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedLongLongTy.getAsOpaquePtr(); 858b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 859b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedInt128Ty.getAsOpaquePtr(); 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_unsigned_char: 863b01000fd063629facd45044f137446fb748ee179Greg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 864b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->UnsignedCharTy.getAsOpaquePtr(); 8657bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 8667bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton return ast->UnsignedShortTy.getAsOpaquePtr(); 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case DW_ATE_imaginary_float: 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This assert should fire for anything that we don't catch above so we know 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to fix any issues we run into. 8755a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton if (type_name) 8765a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton { 8775a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton fprintf (stderr, "error: need to add support for DW_TAG_base_type '%s' encoded with DW_ATE = 0x%x, bit_size = %u\n", type_name, dw_ate, bit_size); 8785a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton } 8795a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton else 8805a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton { 8815a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton fprintf (stderr, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size); 8825a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton } 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 886462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 887b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltInType_void(ASTContext *ast) 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 889b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->VoidTy.getAsOpaquePtr(); 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 892462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 893a91dd997b1e809c67901b7ac481942cacae19150Sean CallananClangASTContext::GetBuiltInType_bool() 894a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan{ 895a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan return getASTContext()->BoolTy.getAsOpaquePtr(); 896a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan} 897a91dd997b1e809c67901b7ac481942cacae19150Sean Callanan 898a91dd997b1e809c67901b7ac481942cacae19150Sean Callananclang_type_t 899960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_id() 900960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 901c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr(); 902960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 903960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 904462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 905960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_Class() 906960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 90704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 908960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 909960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 910462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 911960d6a40711f05effe6fcc5b66f0952450f79ea2Greg ClaytonClangASTContext::GetBuiltInType_objc_selector() 912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 913c4217a663232c014ee054f55bd90ece79803c963Sean Callanan return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr(); 914960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 915960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 916462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast) 918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return ast->UnknownAnyTy.getAsOpaquePtr(); 920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananclang_type_t 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const) 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType char_type(getASTContext()->CharTy); 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char_type.addConst(); 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 933462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetVoidPtrType (bool is_const) 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetVoidPtrType(getASTContext(), is_const); 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 939462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 940b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const) 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 942b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType void_ptr_type(ast->VoidPtrTy); 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (is_const) 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void_ptr_type.addConst(); 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return void_ptr_type.getAsOpaquePtr(); 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 950462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 95122defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast, 95222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 953462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type) 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9558a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 95622defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 95722defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 958ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 959ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 960cf18faaf72090a68480145ca206955d792633559Sean Callanan 96122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType src (QualType::getFromOpaquePtr(clang_type)); 96222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton QualType dst (importer.Import(src)); 963cf18faaf72090a68480145ca206955d792633559Sean Callanan 964cf18faaf72090a68480145ca206955d792633559Sean Callanan return dst.getAsOpaquePtr(); 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9676916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9686916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl * 96922defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast, 97022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTContext *src_ast, 9716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *source_decl) 972887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{ 9738a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan FileSystemOptions file_system_options; 97422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton FileManager file_manager (file_system_options); 97522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton ASTImporter importer(*dst_ast, file_manager, 976ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan *src_ast, file_manager, 977ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan false); 9786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9796916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return importer.Import(source_decl); 9806916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 9816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 9828d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool 983b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::AreTypesSame(ASTContext *ast, 984462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type1, 985462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t type2) 9865510dddc33260a991284ef81ca343594f23262e8Sean Callanan{ 98704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton return ast->hasSameType (QualType::getFromOpaquePtr(type1), 98804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton QualType::getFromOpaquePtr(type2)); 9895510dddc33260a991284ef81ca343594f23262e8Sean Callanan} 9905510dddc33260a991284ef81ca343594f23262e8Sean Callanan 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark CVR modifiers 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 993462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 994462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddConstModifier (clang_type_t clang_type) 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.addConst(); 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1005462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1006462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddRestrictModifier (clang_type_t clang_type) 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setRestrict (true); 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1017462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1018462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::AddVolatileModifier (clang_type_t clang_type) 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType result(QualType::getFromOpaquePtr(clang_type)); 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.getQualifiers().setVolatile (true); 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.getAsOpaquePtr(); 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1029b01000fd063629facd45044f137446fb748ee179Greg Clayton 1030b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1031b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl) 1032b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1033b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1034b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1035b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1036b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1037b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr(); 1038b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1039b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1040b01000fd063629facd45044f137446fb748ee179Greg Clayton 1041b01000fd063629facd45044f137446fb748ee179Greg Claytonclang_type_t 1042b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl) 1043b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1044b01000fd063629facd45044f137446fb748ee179Greg Clayton // No need to call the getASTContext() accessor (which can create the AST 1045b01000fd063629facd45044f137446fb748ee179Greg Clayton // if it isn't created yet, because we can't have created a decl in this 1046b01000fd063629facd45044f137446fb748ee179Greg Clayton // AST if our AST didn't already exist... 1047b01000fd063629facd45044f137446fb748ee179Greg Clayton if (m_ast_ap.get()) 1048b01000fd063629facd45044f137446fb748ee179Greg Clayton return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr(); 1049b01000fd063629facd45044f137446fb748ee179Greg Clayton return NULL; 1050b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1051b01000fd063629facd45044f137446fb748ee179Greg Clayton 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1054462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 1055585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1057b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1058b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 105904325065a00f646527db85e9bc751da29ac53b23Sean Callanan 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 1061b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1064585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton if (language == eLanguageTypeObjC) 10659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1066306edcaab871503192162272c147aef89d0ee719Greg Clayton bool isForwardDecl = true; 10679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bool isInternal = false; 10689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 10699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 10709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we will need to update this code. I was told to currently always use 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the CXXRecordDecl class since we often don't know from debug information 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // if something is struct or a class, so we default to always use the more 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // complete definition just in case. 1076b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *decl = CXXRecordDecl::Create(*ast, 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (TagDecl::TagKind)kind, 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_ctx, 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 1080279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1081b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL); 1082b01000fd063629facd45044f137446fb748ee179Greg Clayton 1083b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(decl).getAsOpaquePtr(); 1084b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1085b01000fd063629facd45044f137446fb748ee179Greg Clayton 1086b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 1087b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern) 1088b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1089b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 1090b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 1091b01000fd063629facd45044f137446fb748ee179Greg Clayton 1092b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1093b01000fd063629facd45044f137446fb748ee179Greg Clayton 1094b01000fd063629facd45044f137446fb748ee179Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1095b01000fd063629facd45044f137446fb748ee179Greg Clayton switch (type_class) 1096b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1097b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Record: 1098b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1099b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 1100b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 1101b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1102b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setHasExternalLexicalStorage (has_extern); 11037a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton cxx_record_decl->setHasExternalVisibleStorage (has_extern); 1104b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1105b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1106b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1107b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1108b01000fd063629facd45044f137446fb748ee179Greg Clayton 1109b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Enum: 1110b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1111b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl(); 1112b01000fd063629facd45044f137446fb748ee179Greg Clayton if (enum_decl) 1113b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1114b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_decl->setHasExternalLexicalStorage (has_extern); 11157a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton enum_decl->setHasExternalVisibleStorage (has_extern); 1116b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1117b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1118b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1119b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1120b01000fd063629facd45044f137446fb748ee179Greg Clayton 1121b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCObject: 1122b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::ObjCInterface: 1123b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1124d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 1125b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (objc_class_type); 1126b01000fd063629facd45044f137446fb748ee179Greg Clayton if (objc_class_type) 1127b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1128b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1129b01000fd063629facd45044f137446fb748ee179Greg Clayton 1130b01000fd063629facd45044f137446fb748ee179Greg Clayton if (class_interface_decl) 1131b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1132b01000fd063629facd45044f137446fb748ee179Greg Clayton class_interface_decl->setHasExternalLexicalStorage (has_extern); 11337a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton class_interface_decl->setHasExternalVisibleStorage (has_extern); 1134b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 1135b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1136b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1137b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1138b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1140b01000fd063629facd45044f137446fb748ee179Greg Clayton case clang::Type::Typedef: 1141b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern); 1142b01000fd063629facd45044f137446fb748ee179Greg Clayton 1143b01000fd063629facd45044f137446fb748ee179Greg Clayton default: 1144b01000fd063629facd45044f137446fb748ee179Greg Clayton break; 1145b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1146b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1149dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool 1150dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 1151dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{ 1152dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (name == NULL || name[0] == '\0') 1153dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return false; 1154dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1155494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator" 1156427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 1157c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1158c2c9a149f127736550d7430653f4c1a51731442eSean Callanan const char *post_op_name = NULL; 1159c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1160494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan bool no_space = true; 1161c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1162427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 1163494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan return false; 1164494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan 1165427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton post_op_name = name + OPERATOR_PREFIX_LENGTH; 1166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1167494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan if (post_op_name[0] == ' ') 1168c2c9a149f127736550d7430653f4c1a51731442eSean Callanan { 1169494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan post_op_name++; 1170494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan no_space = false; 1171c2c9a149f127736550d7430653f4c1a51731442eSean Callanan } 1172c2c9a149f127736550d7430653f4c1a51731442eSean Callanan 1173494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX 1174427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH 1175dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1176dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // This is an operator, set the overloaded operator kind to invalid 1177dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // in case this is a conversion operator... 1178dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 1179dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1180dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[0]) 1181dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1182c2c9a149f127736550d7430653f4c1a51731442eSean Callanan default: 1183c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1184c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1185c2c9a149f127736550d7430653f4c1a51731442eSean Callanan break; 1186dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'n': 1187c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1188c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1189dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "new") == 0) 1190dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_New; 1191dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "new[]") == 0) 1192dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_New; 1193dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1194dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1195dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case 'd': 1196c2c9a149f127736550d7430653f4c1a51731442eSean Callanan if (no_space) 1197c2c9a149f127736550d7430653f4c1a51731442eSean Callanan return false; 1198dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (strcmp (post_op_name, "delete") == 0) 1199dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Delete; 1200dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 1201dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Array_Delete; 1202dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1203dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1204dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '+': 1205dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1206dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Plus; 1207dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1208dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1209dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '=') 1210dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusEqual; 1211dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '+') 1212dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PlusPlus; 1213dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1214dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1215dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1216dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': 1217dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1218dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Minus; 1219dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1220dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1221dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1222dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1223dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_MinusEqual; break; 1224dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '-': op_kind = OO_MinusMinus; break; 1225dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_Arrow; break; 1226dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1227dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1228dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1229dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1230dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '*') 1231dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ArrowStar; break; 1232dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1233dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1234dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1235dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '*': 1236dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1237dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Star; 1238dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1239dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_StarEqual; 1240dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1241dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1242dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '/': 1243dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1244dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Slash; 1245dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1246dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_SlashEqual; 1247dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1248dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1249dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '%': 1250dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1251dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Percent; 1252dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1253dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_PercentEqual; 1254dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1255dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1256dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1257dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '^': 1258dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1259dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Caret; 1260dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1261dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_CaretEqual; 1262dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1263dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1264dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': 1265dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1266dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Amp; 1267dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1268dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1269dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1270dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1271dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_AmpEqual; break; 1272dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '&': op_kind = OO_AmpAmp; break; 1273dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1274dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1275dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1276dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1277dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': 1278dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1279dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Pipe; 1280dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1281dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1282dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1283dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1284dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_PipeEqual; break; 1285dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '|': op_kind = OO_PipePipe; break; 1286dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1287dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1288dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1289dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1290dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '~': 1291dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1292dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Tilde; 1293dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1294dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1295dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '!': 1296dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1297dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Exclaim; 1298dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1299dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_ExclaimEqual; 1300dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1301dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1302dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': 1303dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1304dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Equal; 1305dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1306dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_EqualEqual; 1307dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1308dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1309dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': 1310dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1311dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Less; 1312dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1313dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1314dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1315dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1316dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '<': op_kind = OO_LessLess; break; 1317dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_LessEqual; break; 1318dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1319dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1320dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[3] == '\0') 1321dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1322dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[2] == '=') 1323dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_LessLessEqual; 1324dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1325dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1326dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1327dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': 1328dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1329dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Greater; 1330dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[2] == '\0') 1331dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1332dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton switch (post_op_name[1]) 1333dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1334dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '>': op_kind = OO_GreaterGreater; break; 1335dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '=': op_kind = OO_GreaterEqual; break; 1336dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1337dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1338dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (post_op_name[1] == '>' && 1339dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[2] == '=' && 1340dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton post_op_name[3] == '\0') 1341dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1342dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_GreaterGreaterEqual; 1343dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1344dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1345dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1346dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case ',': 1347dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == '\0') 1348dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Comma; 1349dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1350dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1351dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '(': 1352dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 1353dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Call; 1354dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1355dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1356dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton case '[': 1357dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 1358dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton op_kind = OO_Subscript; 1359dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton break; 1360dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1361dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1362dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton return true; 1363dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton} 1364b01000fd063629facd45044f137446fb748ee179Greg Clayton 13658c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonstatic inline bool 13668c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytoncheck_op_param (bool unary, bool binary, uint32_t num_params) 13678c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{ 13688c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // The parameter count doens't include "this" 13698c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton if (num_params == 0) 13708c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return unary; 13718c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton if (num_params == 1) 13728c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return binary; 13738c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return false; 13748c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton} 13758c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton 13768c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonbool 13778c6907c4daa74a8ebc418ec6eed151b68bda6321Greg ClaytonClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params) 13788c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{ 13798c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (Unary, Binary, num_params); 13808c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton switch (op_kind) 13818c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton { 13828c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#include "clang/Basic/OperatorKinds.def" 13838c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton default: break; 13848c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton } 13858c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return false; 13868c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton} 13878c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton 1388412440aa3a110e4068ee99729f7883c828fb3dceGreg ClaytonCXXMethodDecl * 1389795230029c9c8ff35c167ee5f548b1b373b89c33Sean CallananClangASTContext::AddMethodToCXXRecordType 1390795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan( 1391b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1392462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_opaque_type, 1393412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton const char *name, 1394462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 1395412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton lldb::AccessType access, 13961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_virtual, 13971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_static, 139830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_inline, 139930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton bool is_explicit 1400412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton) 1401795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{ 14023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!record_opaque_type || !method_opaque_type || !name) 1403974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen return NULL; 1404795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1405b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(ast); 1406795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1407b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 1408795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1409795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan assert(identifier_table); 1410795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 14113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 14121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1413b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl(); 1414795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 14151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (cxx_record_decl == NULL) 1416412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return NULL; 1417795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 14181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 14191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 142030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton CXXMethodDecl *cxx_method_decl = NULL; 14213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 142230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton DeclarationName decl_name (&identifier_table->get(name)); 142390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 142490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton const bool is_implicitly_declared = false; 142590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 1426d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 142790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 14285325a360f3e7ca7bd053aa75e828953105d10069Greg Clayton if (function_Type == NULL) 142990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 143090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 1431d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 143230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 143390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (!method_function_prototype) 143490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton return NULL; 143590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 143690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 143790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton 143890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton if (name[0] == '~') 143990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1440b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXDestructorDecl::Create (*ast, 144190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1442279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1443b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 144490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 14458950c9a1faa1eb762d92ccdc860dc2eaa88a6868Sean Callanan NULL, 144690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_inline, 144790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_implicitly_declared); 144890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1449b01000fd063629facd45044f137446fb748ee179Greg Clayton else if (decl_name == cxx_record_decl->getDeclName()) 145030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton { 1451b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConstructorDecl::Create (*ast, 145230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton cxx_record_decl, 1453279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1454b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 145530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton method_qual_type, 145630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton NULL, // TypeSourceInfo * 145730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit, 145830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 145930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_implicitly_declared); 146030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 146130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton else 146290e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1463dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1464dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 1465dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (IsOperator (name, op_kind)) 146690e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1467dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 1468dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 14698c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // Check the number of operator parameters. Sometimes we have 14708c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // seen bad DWARF that doesn't correctly describe operators and 14718c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // if we try to create a methed and add it to the class, clang 14728c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // will assert and crash, so we need to make sure things are 14738c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton // acceptable. 14748c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params)) 14758c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton return NULL; 1476b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 147790e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1478279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1479b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 148090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 148190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 1482dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_static, 1483dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton SC_None, 1484279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_inline, 1485279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 1486dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 1487dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton else if (num_params == 0) 1488dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton { 1489dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton // Conversion operators don't take params... 1490b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXConversionDecl::Create (*ast, 1491dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton cxx_record_decl, 1492279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1493b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()), 1494dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton method_qual_type, 1495dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton NULL, // TypeSourceInfo * 1496dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton is_inline, 1497279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_explicit, 1498279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 1499dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton } 150090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 1501dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1502dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton if (cxx_method_decl == NULL) 150390e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton { 1504b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_method_decl = CXXMethodDecl::Create (*ast, 150590e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton cxx_record_decl, 1506279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 1507dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 150890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton method_qual_type, 150990e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton NULL, // TypeSourceInfo * 151090e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton is_static, 151190e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton SC_None, 1512279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan is_inline, 1513279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation()); 151490e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton } 151530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton } 1516dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton 1517462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 151847a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 15191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setAccess (access_specifier); 15201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 152147a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan 15223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan // Populate the method decl with parameter decls 15233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1524a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis llvm::SmallVector<ParmVarDecl *, 12> params; 15253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 15263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan for (int param_index = 0; 15273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan param_index < num_params; 15283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ++param_index) 15293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1530a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis params.push_back (ParmVarDecl::Create (*ast, 1531a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis cxx_method_decl, 1532a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SourceLocation(), 1533a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SourceLocation(), 1534a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis NULL, // anonymous 1535a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis method_function_prototype->getArgType(param_index), 1536a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis NULL, 1537a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SC_None, 1538a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis SC_None, 1539a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis NULL)); 15403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 15413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1542a71464f0ac148cf5d6bfc0ed009edc3b97076dabCharles Davis cxx_method_decl->setParams (params.data(), num_params); 15433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 15441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 15457a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton 15467a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic()); 15477a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate()); 15487a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD()); 15497a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty()); 15507a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract()); 15517a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor()); 15527a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor()); 15537a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment()); 15547a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor()); 1555412440aa3a110e4068ee99729f7883c828fb3dceGreg Clayton return cxx_method_decl; 1556795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan} 1557795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan 1558795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callananbool 155984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddFieldToRecordType 156084f8075072eef306234f8109573067647735c111Greg Clayton( 1561b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1562462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t record_clang_type, 156384f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1564462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t field_type, 156584f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 156684f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size 156784f8075072eef306234f8109573067647735c111Greg Clayton) 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_clang_type == NULL || field_type == NULL) 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1572b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1574b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1579d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = record_qual_type.getTypePtr(); 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = dyn_cast<RecordType>(clang_type); 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_type) 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl *record_decl = record_type->getDecl(); 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::Expr *bit_width = NULL; 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bitfield_bit_size != 0) 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1591b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1592b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1594b01000fd063629facd45044f137446fb748ee179Greg Clayton FieldDecl *field = FieldDecl::Create (*ast, 159584f8075072eef306234f8109573067647735c111Greg Clayton record_decl, 159684f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1597279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 159884f8075072eef306234f8109573067647735c111Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 159984f8075072eef306234f8109573067647735c111Greg Clayton QualType::getFromOpaquePtr(field_type), // Field type 160084f8075072eef306234f8109573067647735c111Greg Clayton NULL, // DeclaratorInfo * 160184f8075072eef306234f8109573067647735c111Greg Clayton bit_width, // BitWidth 160284f8075072eef306234f8109573067647735c111Greg Clayton false); // Mutable 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160484f8075072eef306234f8109573067647735c111Greg Clayton field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field) 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner record_decl->addDecl(field); 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 16129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1613d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 16149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 16159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 16161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 1617b01000fd063629facd45044f137446fb748ee179Greg Clayton ClangASTContext::AddObjCClassIVar (ast, 161860a0ced7da29dbe746115d7ae3498c0e1af5d58aSean Callanan record_clang_type, 16199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 16209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton field_type, 16219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton access, 16229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bitfield_bit_size, 16231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 16249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 16259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 163524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 163724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 1639b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 164024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FieldDecl* field, 164124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t& bitfield_bit_size 164224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1644b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast == NULL || field == NULL) 164524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 164624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 164724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->isBitField()) 164824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Expr* bit_width_expr = field->getBitWidth(); 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_width_expr) 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt bit_width_apsint; 1653b01000fd063629facd45044f137446fb748ee179Greg Clayton if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast)) 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 166224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl) 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (record_decl == NULL) 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!record_decl->field_empty()) 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No fields, lets check this is a CXX record and check the base classes 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl)) 168324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1690b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1692b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1694b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 1695b01000fd063629facd45044f137446fb748ee179Greg Clayton 1696d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr()); 1697b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_type) 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1699b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl *record_decl = record_type->getDecl(); 1700b01000fd063629facd45044f137446fb748ee179Greg Clayton if (record_decl) 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1702b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t field_idx; 1703b01000fd063629facd45044f137446fb748ee179Greg Clayton RecordDecl::field_iterator field, field_end; 1704b01000fd063629facd45044f137446fb748ee179Greg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 1705b01000fd063629facd45044f137446fb748ee179Greg Clayton field != field_end; 1706b01000fd063629facd45044f137446fb748ee179Greg Clayton ++field, ++field_idx) 170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1708b01000fd063629facd45044f137446fb748ee179Greg Clayton // If no accessibility was assigned, assign the correct one 1709b01000fd063629facd45044f137446fb748ee179Greg Clayton if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 1710b01000fd063629facd45044f137446fb748ee179Greg Clayton field->setAccess ((AccessSpecifier)default_accessibility); 171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark C++ Base Classes 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCXXBaseSpecifier * 1720462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_type) 17236e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton return new CXXBaseSpecifier (SourceRange(), 17246e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton is_virtual, 17256e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton base_of_class, 17266e71340988075f55c85e8bfcbc503ceaceb157c7Greg Clayton ConvertAccessTypeToAccessSpecifier (access), 1727ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)), 1728ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan SourceLocation()); 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1732e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Claytonvoid 1733e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg ClaytonClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1734e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton{ 1735e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 1736e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton { 1737e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton delete base_classes[i]; 1738e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton base_classes[i] = NULL; 1739e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton } 1740e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton} 1741e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1743462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (class_clang_type) 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1747b01000fd063629facd45044f137446fb748ee179Greg Clayton CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl(); 1748b01000fd063629facd45044f137446fb748ee179Greg Clayton if (cxx_record_decl) 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1750b01000fd063629facd45044f137446fb748ee179Greg Clayton cxx_record_decl->setBases(base_classes, num_base_classes); 1751b01000fd063629facd45044f137446fb748ee179Greg Clayton return true; 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 175684f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes 175784f8075072eef306234f8109573067647735c111Greg Clayton 1758462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 175984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::CreateObjCClass 176084f8075072eef306234f8109573067647735c111Greg Clayton( 176184f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 176284f8075072eef306234f8109573067647735c111Greg Clayton DeclContext *decl_ctx, 176384f8075072eef306234f8109573067647735c111Greg Clayton bool isForwardDecl, 176484f8075072eef306234f8109573067647735c111Greg Clayton bool isInternal 176584f8075072eef306234f8109573067647735c111Greg Clayton) 176684f8075072eef306234f8109573067647735c111Greg Clayton{ 1767b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 1768b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 176984f8075072eef306234f8109573067647735c111Greg Clayton assert (name && name[0]); 177084f8075072eef306234f8109573067647735c111Greg Clayton if (decl_ctx == NULL) 1771b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 177284f8075072eef306234f8109573067647735c111Greg Clayton 177384f8075072eef306234f8109573067647735c111Greg Clayton // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 177484f8075072eef306234f8109573067647735c111Greg Clayton // we will need to update this code. I was told to currently always use 177584f8075072eef306234f8109573067647735c111Greg Clayton // the CXXRecordDecl class since we often don't know from debug information 177684f8075072eef306234f8109573067647735c111Greg Clayton // if something is struct or a class, so we default to always use the more 177784f8075072eef306234f8109573067647735c111Greg Clayton // complete definition just in case. 1778b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast, 177984f8075072eef306234f8109573067647735c111Greg Clayton decl_ctx, 178084f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 1781b01000fd063629facd45044f137446fb748ee179Greg Clayton &ast->Idents.get(name), 178284f8075072eef306234f8109573067647735c111Greg Clayton SourceLocation(), 178384f8075072eef306234f8109573067647735c111Greg Clayton isForwardDecl, 178484f8075072eef306234f8109573067647735c111Greg Clayton isInternal); 17859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1786b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getObjCInterfaceType(decl).getAsOpaquePtr(); 178784f8075072eef306234f8109573067647735c111Greg Clayton} 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 178984f8075072eef306234f8109573067647735c111Greg Claytonbool 1790462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 179184f8075072eef306234f8109573067647735c111Greg Clayton{ 179284f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type && super_opaque_type) 179384f8075072eef306234f8109573067647735c111Greg Clayton { 179484f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 179584f8075072eef306234f8109573067647735c111Greg Clayton QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 1796d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 1797d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *super_type = super_qual_type.getTypePtr(); 179884f8075072eef306234f8109573067647735c111Greg Clayton if (class_type && super_type) 179984f8075072eef306234f8109573067647735c111Greg Clayton { 1800d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1801d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 180284f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type && objc_super_type) 180384f8075072eef306234f8109573067647735c111Greg Clayton { 180484f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 180584f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 180684f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl && super_interface_decl) 180784f8075072eef306234f8109573067647735c111Greg Clayton { 180884f8075072eef306234f8109573067647735c111Greg Clayton class_interface_decl->setSuperClass(super_interface_decl); 180984f8075072eef306234f8109573067647735c111Greg Clayton return true; 181084f8075072eef306234f8109573067647735c111Greg Clayton } 181184f8075072eef306234f8109573067647735c111Greg Clayton } 181284f8075072eef306234f8109573067647735c111Greg Clayton } 181384f8075072eef306234f8109573067647735c111Greg Clayton } 181484f8075072eef306234f8109573067647735c111Greg Clayton return false; 181584f8075072eef306234f8109573067647735c111Greg Clayton} 181684f8075072eef306234f8109573067647735c111Greg Clayton 181784f8075072eef306234f8109573067647735c111Greg Clayton 181884f8075072eef306234f8109573067647735c111Greg Claytonbool 181984f8075072eef306234f8109573067647735c111Greg ClaytonClangASTContext::AddObjCClassIVar 182084f8075072eef306234f8109573067647735c111Greg Clayton( 1821b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1822462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 182384f8075072eef306234f8109573067647735c111Greg Clayton const char *name, 1824462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t ivar_opaque_type, 182584f8075072eef306234f8109573067647735c111Greg Clayton AccessType access, 182684f8075072eef306234f8109573067647735c111Greg Clayton uint32_t bitfield_bit_size, 18271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized 182884f8075072eef306234f8109573067647735c111Greg Clayton) 182984f8075072eef306234f8109573067647735c111Greg Clayton{ 183084f8075072eef306234f8109573067647735c111Greg Clayton if (class_opaque_type == NULL || ivar_opaque_type == NULL) 183184f8075072eef306234f8109573067647735c111Greg Clayton return false; 183284f8075072eef306234f8109573067647735c111Greg Clayton 1833b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 183484f8075072eef306234f8109573067647735c111Greg Clayton 1835b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 183684f8075072eef306234f8109573067647735c111Greg Clayton assert (identifier_table != NULL); 183784f8075072eef306234f8109573067647735c111Greg Clayton 183884f8075072eef306234f8109573067647735c111Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 183984f8075072eef306234f8109573067647735c111Greg Clayton 1840d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 184184f8075072eef306234f8109573067647735c111Greg Clayton if (class_type) 184284f8075072eef306234f8109573067647735c111Greg Clayton { 1843d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 184484f8075072eef306234f8109573067647735c111Greg Clayton 184584f8075072eef306234f8109573067647735c111Greg Clayton if (objc_class_type) 184684f8075072eef306234f8109573067647735c111Greg Clayton { 184784f8075072eef306234f8109573067647735c111Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 184884f8075072eef306234f8109573067647735c111Greg Clayton 184984f8075072eef306234f8109573067647735c111Greg Clayton if (class_interface_decl) 185084f8075072eef306234f8109573067647735c111Greg Clayton { 185184f8075072eef306234f8109573067647735c111Greg Clayton clang::Expr *bit_width = NULL; 185284f8075072eef306234f8109573067647735c111Greg Clayton if (bitfield_bit_size != 0) 185384f8075072eef306234f8109573067647735c111Greg Clayton { 1854b01000fd063629facd45044f137446fb748ee179Greg Clayton APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1855b01000fd063629facd45044f137446fb748ee179Greg Clayton bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 185684f8075072eef306234f8109573067647735c111Greg Clayton } 185784f8075072eef306234f8109573067647735c111Greg Clayton 1858b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast, 18599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl, 18609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton SourceLocation(), 1861279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 18629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton &identifier_table->get(name), // Identifier 18639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 18649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton NULL, // TypeSourceInfo * 18659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 18669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton bit_width, 18671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized); 18689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (field) 18709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 18719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl->addDecl(field); 18729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 18739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 187484f8075072eef306234f8109573067647735c111Greg Clayton } 187584f8075072eef306234f8109573067647735c111Greg Clayton } 187684f8075072eef306234f8109573067647735c111Greg Clayton } 187784f8075072eef306234f8109573067647735c111Greg Clayton return false; 187884f8075072eef306234f8109573067647735c111Greg Clayton} 187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18819488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 1882462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 18839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 18849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 18859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 1886d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 18879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_type) 18889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 1889d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 18909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 18929488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 18939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 18949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 18959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 18969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 18979488b7423b556c7c777b721d2094fd5ec4a47578Greg Claytonbool 18989488b7423b556c7c777b721d2094fd5ec4a47578Greg ClaytonClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 18999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton{ 19009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton while (class_interface_decl) 19019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 19029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl->ivar_size() > 0) 19039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return true; 19049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 19059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (check_superclass) 19069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 19079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 19089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 19099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 19109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return false; 19119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton} 19121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1913462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonObjCMethodDecl * 19141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg ClaytonClangASTContext::AddMethodToObjCObjectType 19151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton( 1916b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 1917462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t class_opaque_type, 19181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1919462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t method_opaque_type, 19201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::AccessType access 19211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton) 19221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 19231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_opaque_type == NULL || method_opaque_type == NULL) 19241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1926b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierTable *identifier_table = &ast->Idents; 19271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1928b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton assert (identifier_table != NULL); 19301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 19321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1933d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *class_type = class_qual_type.getTypePtr(); 19341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_type == NULL) 19351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1937d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 19381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_class_type == NULL) 19401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 19431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (class_interface_decl == NULL) 19451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *selector_start = ::strchr (name, ' '); 19481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_start == NULL) 19491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_start++; 19521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 19531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 19551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1956ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton size_t len = 0; 19571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const char *start; 1958ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton //printf ("name = '%s'\n", name); 1959ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1960ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton unsigned num_selectors_with_args = 0; 1961ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (start = selector_start; 19621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton start && *start != '\0' && *start != ']'; 1963ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton start += len) 19641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 1965ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton len = ::strcspn(start, ":]"); 19666bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton bool has_arg = (start[len] == ':'); 19676bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 1968ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ++num_selectors_with_args; 19691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 19706bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton if (has_arg) 19716bc44a42f193a4b4b66d73587f742aaa51da2ac3Greg Clayton len += 1; 19721d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 19731d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19741d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (selector_idents.size() == 0) 19761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return 0; 19771d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1978b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 19791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton selector_idents.data()); 19801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 19821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton // Populate the method decl with parameter decls 1984d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *method_type(method_qual_type.getTypePtr()); 19851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (method_type == NULL) 19871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 1989d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 19901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (!method_function_prototype) 19921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 19931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 19951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_variadic = false; 19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_synthesized = false; 19971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton bool is_defined = false; 19981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 19991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 20011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2002b01000fd063629facd45044f137446fb748ee179Greg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast, 20031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // beginLoc, 20041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), // endLoc, 20051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_selector, 20061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getResultType(), 20071d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 20081d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton GetDeclContextForType (class_opaque_type), 20091d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton name[0] == '-', 20101d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_variadic, 20111d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_synthesized, 20121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_defined, 20131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton imp_control, 20141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton num_args); 20151d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (objc_method_decl == NULL) 20181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return NULL; 20191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (num_args > 0) 20211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 20221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 20231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton for (int param_index = 0; param_index < num_args; ++param_index) 20251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 2026b01000fd063629facd45044f137446fb748ee179Greg Clayton params.push_back (ParmVarDecl::Create (*ast, 20271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton objc_method_decl, 20281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SourceLocation(), 2029279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 20301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, // anonymous 20311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_function_prototype->getArgType(param_index), 20321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL, 20331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 20341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton SC_Auto, 20351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton NULL)); 20361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 20371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2038b01000fd063629facd45044f137446fb748ee179Greg Clayton objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args); 20391d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 20409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 20411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 20421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20431d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return objc_method_decl; 20451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 20461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 20471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 2048bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonuint32_t 2049f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetTypeInfo 2050f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton( 2051f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t clang_type, 2052b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ASTContext *ast, 2053f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t *pointee_or_element_clang_type 2054f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton) 2055bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 2056bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type == NULL) 2057f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 2058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2059f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2060f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = NULL; 2061bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2062bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 2063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 2064bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2065bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton switch (type_class) 2066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 206704325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 206804325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 206904325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 207004325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 207104325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 2072b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast && pointee_or_element_clang_type) 2073b01000fd063629facd45044f137446fb748ee179Greg Clayton *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 207404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 2075f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2076f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton default: 2077f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 207804325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 207904325065a00f646527db85e9bc751da29ac53b23Sean Callanan return eTypeIsBuiltIn | eTypeHasValue; 2080f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2081f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::BlockPointer: 2082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 2085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2086e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue; 2087f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2088f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ConstantArray: 2089f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::DependentSizedArray: 2090f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::IncompleteArray: 2091f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::VariableArray: 2092f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2093f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 2094f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsArray; 2095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2096bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentName: return 0; 2097bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 2098bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 2099bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Decltype: return 0; 2100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2101f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Enum: 2102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 2104f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 2105f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2106bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Elaborated: return 0; 2107bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 2108bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 2109bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 2110bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::InjectedClassName: return 0; 2111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2112f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2113f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2115f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 2116f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 2117f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2118bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 2119f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2120f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::ObjCObjectPointer: 2121f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2122f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2123f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 2124f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2125bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2126bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2127f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2128f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Pointer: 2129f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type) 2130f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2131f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 2132f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Record: 2134bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (qual_type->getAsCXXRecordDecl()) 2135bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 2136bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton else 2137bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return eTypeHasChildren | eTypeIsStructUnion; 2138bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton break; 2139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 2140bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 2141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 2142f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2143f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::Typedef: 21449e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2145b01000fd063629facd45044f137446fb748ee179Greg Clayton ast, 2146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_or_element_clang_type); 2147f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2148bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOfExpr: return 0; 2149bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::TypeOf: return 0; 2150bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2151bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 2152bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton default: return 0; 2153bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 2154bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return 0; 2155bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 2156bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 21579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Aggregate Types 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 2161462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsAggregateType (clang_type_t clang_type) 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 216324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 216903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 21721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 21731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 21741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ExtVector: 21751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Vector: 21761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 21779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 21789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 217924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 218024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 21829e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 218324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 218424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The clang type does have a value 218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 2192b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes) 219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2194b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_children = 0; 2198b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 21999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 22009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2202960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2203960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 2204960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2205f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::BuiltinType::ObjCId: // child is Class 2206960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: // child is Class 2207960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2208f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2209960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2210960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2211960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2212960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2213960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2214c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2215e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 0; 2216c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 22171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 22187a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check each base classes to see if it or any of its 222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // base classes contain any fields. This can help 223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // limit the noise in variable views by not having to 223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // show base classes that contain no members. 223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children++; 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 224624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 224724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include all base classes 224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children += cxx_record_decl->getNumBases(); 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 225124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_children; 225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 22609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 22617a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 22629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2263d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 22649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 22659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 22669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 22689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 22709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 22739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 22749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 22769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 22779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 22789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 22799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 22819488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++num_children; 22829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton num_children += class_interface_decl->ivar_size(); 22859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22869488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 22889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 22899488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 22909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 2291960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2292d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 2293960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2294b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2295b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2296960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes); 2297960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // If this type points to a simple type, then it has 1 child 2298960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (num_pointee_children == 0) 2299960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = 1; 2300960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2301960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton num_children = num_pointee_children; 2302960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2303960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 23049488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 23051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2311d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 2312c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType pointee_type (pointer_type->getPointeeType()); 2313b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2314b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 23159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_pointee_children == 0) 2317c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 2318c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We have a pointer to a pointee type that claims it has no children. 2319c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton // We will want to look at 2320c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr()); 2321c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_children = num_pointee_children; 232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 232624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2327f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2328f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2329f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2330d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 2331f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 2332b01000fd063629facd45044f137446fb748ee179Greg Clayton uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2333b01000fd063629facd45044f137446fb748ee179Greg Clayton pointee_type.getAsOpaquePtr(), 2334f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes); 2335f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // If this type points to a simple type, then it has 1 child 2336f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (num_pointee_children == 0) 2337f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = 1; 2338f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2339f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton num_children = num_pointee_children; 2340f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2341f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2342f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2343f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 23441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 2345b01000fd063629facd45044f137446fb748ee179Greg Clayton num_children = ClangASTContext::GetNumChildren (ast, 2346b01000fd063629facd45044f137446fb748ee179Greg Clayton cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2347b01000fd063629facd45044f137446fb748ee179Greg Clayton omit_empty_base_classes); 234824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 235024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_children; 235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2356c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no 2357c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// children, then we either need to trust it, or override it and return a 2358c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// different result. For example, an "int *" has one child that is an integer, 2359c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// but a function pointer doesn't have any children. Likewise if a Record type 2360c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton// claims it has no children, then there really is nothing to show. 2361c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Claytonuint32_t 2362c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonClangASTContext::GetNumPointeeChildren (clang_type_t clang_type) 2363c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton{ 2364c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton if (clang_type == NULL) 2365c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2366c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton 2367c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2368c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2369c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton switch (type_class) 2370c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton { 23719db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::Type::Builtin: 23729db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 23739db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton { 2374abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton case clang::BuiltinType::UnknownAny: 23759db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Void: 23769db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::NullPtr: 23779db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 0; 23789db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Bool: 23799db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_U: 23809db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UChar: 2381ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_U: 23829db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char16: 23839db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char32: 23849db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UShort: 23859db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt: 23869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULong: 23879db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ULongLong: 23889db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::UInt128: 23899db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Char_S: 23909db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::SChar: 2391ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan case clang::BuiltinType::WChar_S: 23929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Short: 23939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int: 23949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Long: 23959db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongLong: 23969db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Int128: 23979db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Float: 23989db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Double: 23999db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::LongDouble: 24009db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Dependent: 24019db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::Overload: 24029db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCId: 24039db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCClass: 24049db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton case clang::BuiltinType::ObjCSel: 24050de254aaec7d6766379191e5397ec2294042c5d7Sean Callanan case clang::BuiltinType::BoundMember: 24069db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return 1; 24079db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton } 24089db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton break; 24099db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 2410e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton case clang::Type::Complex: return 1; 2411c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Pointer: return 1; 2412c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 2413c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::LValueReference: return 1; 2414c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::RValueReference: return 1; 2415c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::MemberPointer: return 0; 2416c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ConstantArray: return 0; 2417c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::IncompleteArray: return 0; 2418c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::VariableArray: return 0; 2419c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedArray: return 0; 2420c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentSizedExtVector: return 0; 2421c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Vector: return 0; 2422c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ExtVector: return 0; 2423c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 2424c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 2425c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::UnresolvedUsing: return 0; 2426c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Paren: return 0; 2427c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2428c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOfExpr: return 0; 2429c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TypeOf: return 0; 2430c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Decltype: return 0; 2431c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Record: return 0; 2432c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Enum: return 1; 2433c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::Elaborated: return 1; 2434c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateTypeParm: return 1; 2435c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::SubstTemplateTypeParm: return 1; 2436c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::TemplateSpecialization: return 1; 2437c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::InjectedClassName: return 0; 2438c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentName: return 1; 2439c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::DependentTemplateSpecialization: return 1; 2440c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObject: return 0; 2441c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCInterface: return 0; 2442c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton case clang::Type::ObjCObjectPointer: return 1; 2443c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton default: 2444c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton break; 2445c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton } 2446c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton return 0; 2447c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton} 244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2449462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 245258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext *exe_ctx, 245324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2454462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 245524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 245624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 245724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 245824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2462bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 246300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 246400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 246724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type) 246824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 247058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham getASTContext(), 247124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 247224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_clang_type, 247324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 247424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 247524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 247624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 247724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 247824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 247924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2480bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 248100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 248200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 248324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 248424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 248524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2486462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 248724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetChildClangTypeAtIndex 248824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 248958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ExecutionContext *exe_ctx, 2490b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 249124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *parent_name, 2492462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t parent_clang_type, 249324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx, 249424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool transparent_pointers, 249524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 249624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string& child_name, 249724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_byte_size, 249824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int32_t &child_byte_offset, 249924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t &child_bitfield_bit_size, 2500bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton uint32_t &child_bitfield_bit_offset, 250100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_base_class, 250200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool &child_is_deref_of_parent 250324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 250424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 250524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_clang_type == NULL) 250624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2508b01000fd063629facd45044f137446fb748ee179Greg Clayton if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes)) 250924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 251024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bit_offset; 251124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size = 0; 251224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = 0; 2513bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = false; 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 251503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 251603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (parent_type_class) 251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2518960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::Type::Builtin: 2519960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2520960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2521960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCId: 2522960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton case clang::BuiltinType::ObjCClass: 252304325065a00f646527db85e9bc751da29ac53b23Sean Callanan child_name = "isa"; 2524b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT; 2525b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 2526960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2527960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton default: 2528960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2529960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2530960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton break; 2531960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 25321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 25337a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 253524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 253624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 253724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 2538b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl); 253924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 254024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 254124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 254224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 254324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We might have base classes to print out first 254524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 254624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 254724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 254824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 254924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *base_class_decl = NULL; 255124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 255224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 255324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 255424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 255524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (RecordHasFields(base_class_decl) == false) 255724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 255824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 255924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 256124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 256224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class_decl == NULL) 256324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 256424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 256624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class->isVirtual()) 2567a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 256824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 2569a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Base classes should be a multiple of 8 bits in size 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (bit_offset % 8 == 0); 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset/8; 2574b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton 2575b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton child_name = ClangASTType::GetTypeNameForQualType(base_class->getType()); 257624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2577b01000fd063629facd45044f137446fb748ee179Greg Clayton uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25799994a0bcfe1790b320f6a9cf51c8d5ac9c4efdbdJim Ingham // Base classes bit sizes should be a multiple of 8 bits in size 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (clang_type_info_bit_size % 8 == 0); 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info_bit_size / 8; 2582bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 258324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return base_class->getType().getAsOpaquePtr(); 258424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We don't increment the child index in the for loop since we might 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be skipping empty base classes 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 258824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure index is in range... 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t field_idx = 0; 259224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 259324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 259424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == child_idx) 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 259724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member type if requested 259824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Print the member name and equal sign 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(field->getNameAsString().c_str()); 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the type byte size (field_type_info.first) and 260224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // alignment (field_type_info.second) from the AST context. 2603b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType()); 260454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton assert(field_idx < record_layout.getFieldCount()); 260524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = field_type_info.first / 8; 260724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out the field offset within the current struct/union/class type 260924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bit_offset = record_layout.getFieldOffset (field_idx); 261024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = bit_offset / 8; 2611b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size)) 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_offset = bit_offset % 8; 261324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return field->getType().getAsOpaquePtr(); 261524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 261624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 261724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 261924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 26219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 26227a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, parent_qual_type)) 26239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2624d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 26259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 26269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 26279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 26299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 26309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 26329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2634b01000fd063629facd45044f137446fb748ee179Greg Clayton const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl); 26359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 26369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 26379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (omit_empty_base_classes) 26399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2640b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 26419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx == 0) 26439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2644b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl)); 26459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 26489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2649b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 26509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 2652960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2653bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_is_base_class = true; 26549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 26569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 26619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton else 26629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 26639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 2664960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2665960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton const uint32_t superclass_idx = child_idx; 26669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26679488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 26689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 26709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 26729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (child_idx == idx) 26749488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 26759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 26769488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton QualType ivar_qual_type(ivar_decl->getType()); 26789488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26799488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 26809488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 2681b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 26829488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26839488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_byte_size = ivar_type_info.first / 8; 26849488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 26859488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // Figure out the field offset within the current struct/union/class type 268658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since 268758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // that doesn't account for the space taken up by unbacked properties, or from 268858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // the changing size of base classes that are newer than this class. 268958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham // So if we have a process around that we can ask about this object, do so. 269058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_byte_offset = LLDB_INVALID_IVAR_OFFSET; 269158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 269258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham if (exe_ctx && exe_ctx->process) 269358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham { 269458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ObjCLanguageRuntime *objc_runtime = exe_ctx->process->GetObjCLanguageRuntime(); 269558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham if (objc_runtime != NULL) 269658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham { 269758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ClangASTType parent_ast_type (parent_qual_type.getAsOpaquePtr(), ast); 269858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str()); 269958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham } 270058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham } 270158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham 270258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET) 270358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham { 270458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 270558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham child_byte_offset = bit_offset / 8; 270658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham } 27079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return ivar_qual_type.getAsOpaquePtr(); 27099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 27119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 27199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 2720d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2721960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton QualType pointee_type = pointer_type->getPointeeType(); 2722960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2723960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2724960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 272500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 272600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 272758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 272858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 2729960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton parent_name, 2730960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton pointer_type->getPointeeType().getAsOpaquePtr(), 2731960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton idx, 2732960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton transparent_pointers, 2733960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton omit_empty_base_classes, 2734960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name, 2735960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size, 2736960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset, 2737960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_bitfield_bit_size, 2738bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 273900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 274000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2741960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2742960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton else 2743960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 274400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 2745960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (parent_name) 2746960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2747960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name.assign(1, '*'); 2748960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_name += parent_name; 2749960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2750960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 2751960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton // We have a pointer to an simple type 2752960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (idx == 0) 2753960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 2754b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2755960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton assert(clang_type_info.first % 8 == 0); 2756960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_size = clang_type_info.first / 8; 2757960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton child_byte_offset = 0; 2758960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton return pointee_type.getAsOpaquePtr(); 2759960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 2760960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 27619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 27629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 27639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 27641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t element_count = array->getSize().getLimitedValue(); 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < element_count) 277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2771b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetCompleteQualType (ast, array->getElementType())) 2772b01000fd063629facd45044f137446fb748ee179Greg Clayton { 2773b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2775b01000fd063629facd45044f137446fb748ee179Greg Clayton char element_name[64]; 2776b01000fd063629facd45044f137446fb748ee179Greg Clayton ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2778b01000fd063629facd45044f137446fb748ee179Greg Clayton child_name.assign(element_name); 2779b01000fd063629facd45044f137446fb748ee179Greg Clayton assert(field_type_info.first % 8 == 0); 2780b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_size = field_type_info.first / 8; 2781b01000fd063629facd45044f137446fb748ee179Greg Clayton child_byte_offset = idx * child_byte_size; 2782b01000fd063629facd45044f137446fb748ee179Greg Clayton return array->getElementType().getAsOpaquePtr(); 2783b01000fd063629facd45044f137446fb748ee179Greg Clayton } 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 278724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 278924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2790d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 27929db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton 27939db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton // Don't dereference "void *" pointers 27949db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton if (pointee_type->isVoidType()) 27959db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton return NULL; 279624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 279824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 279900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 280000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 280158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 280258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 280324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 280524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 280624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 280724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 280924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 281024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2812bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 281300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 281400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 281624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 281724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = true; 281900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton 282024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (parent_name) 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name.assign(1, '*'); 282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name += parent_name; 282424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have a pointer to an simple type 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx == 0) 282824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2829b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 283024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(clang_type_info.first % 8 == 0); 283124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size = clang_type_info.first / 8; 283224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset = 0; 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return pointee_type.getAsOpaquePtr(); 283424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 283724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 283824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2839f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::LValueReference: 2840f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton case clang::Type::RValueReference: 2841f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2842d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2843f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 2844f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2845f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2846f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 284700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent = false; 284800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton bool tmp_child_is_deref_of_parent = false; 284958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 285058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 2851f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton parent_name, 2852f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton pointee_clang_type, 2853f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton idx, 2854f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton transparent_pointers, 2855f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton omit_empty_base_classes, 2856f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name, 2857f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size, 2858f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset, 2859f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_size, 2860f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_bitfield_bit_offset, 286100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 286200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton tmp_child_is_deref_of_parent); 2863f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2864f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 2865f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2866f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (parent_name) 2867f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2868f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name.assign(1, '&'); 2869f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_name += parent_name; 2870f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2871f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 2872f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We have a pointer to an simple type 2873f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (idx == 0) 2874f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 2875b01000fd063629facd45044f137446fb748ee179Greg Clayton std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2876f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton assert(clang_type_info.first % 8 == 0); 2877f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_size = clang_type_info.first / 8; 2878f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton child_byte_offset = 0; 2879f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return pointee_type.getAsOpaquePtr(); 2880f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2881f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2882f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 2883f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton break; 2884f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 28851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 288658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham return GetChildClangTypeAtIndex (exe_ctx, 288758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham ast, 288824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_name, 28899e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx, 289124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner transparent_pointers, 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 289324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_name, 289424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_size, 289524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_byte_offset, 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_bitfield_bit_size, 2897bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton child_bitfield_bit_offset, 289800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_base_class, 289900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton child_is_deref_of_parent); 290024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 290124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 290324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 290424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2906f8e98a6e4560c632a9c0373abee247e747097845Greg Clayton return NULL; 290724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 290824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool 291024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 291124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2912b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false; 291324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 291424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 291624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_bases = 0; 291924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 292524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 292724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 293224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 293324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_bases; 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 293824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_bases = cxx_record_decl->getNumBases(); 293924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_bases; 294124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 294224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 294524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordBase 294624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 294724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 294824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXBaseSpecifier *base_spec, 294924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 295024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 295124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 295224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 295324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 295524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *super_name = record_decl->getNameAsCString(); 295724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 295824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 295924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 296024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 296324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 296424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 296524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 296624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes) 296824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 296924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (BaseSpecifierIsEmpty (base_class)) 297024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 297124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 297224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 297324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 297424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx, 297524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 297624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 297724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 297824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (base_class == base_spec) 297924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 298024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 298124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 298324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 298524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 298624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 298824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t 298924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGetIndexForRecordChild 299024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 299124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl, 299224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NamedDecl *canonical_decl, 299324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 299424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 299524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 299624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 299724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 299824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 299924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 300124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (cxx_record_decl) 300224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 300324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 300424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 300524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// base_class != base_class_end; 300624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++base_class) 300724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (omit_empty_base_classes) 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 301024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (BaseSpecifierIsEmpty (base_class)) 301124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// continue; 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// record_decl->getNameAsCString(), 301624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// canonical_decl->getNameAsCString(), 301724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// child_idx, 301824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 302124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (curr_base_class_decl == canonical_decl) 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return child_idx; 302524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 302624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ++child_idx; 302724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 303024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint32_t num_bases = child_idx; 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 303224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 303424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 303524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 303624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// record_decl->getNameAsCString(), 303824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// canonical_decl->getNameAsCString(), 303924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_idx - num_bases, 304024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// field->getNameAsCString()); 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getCanonicalDecl() == canonical_decl) 304324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 304724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 304824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 304924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Look for a child member (doesn't include base classes, but it does include 305024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// their members) in the type hierarchy. Returns an index path into "clang_type" 305124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// on how to reach the appropriate member. 305224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 305324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class A 305424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 305524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public: 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_a; 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int m_b; 305824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 306024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class B 306124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 306224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 306424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// class C : 306524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public B, 306624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// public A 306724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 306824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// }; 306924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 307024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If we have a clang type that describes "class C", and we wanted to looked 307124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "m_b" in it: 307224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 307324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == false we would get an integer array back with: 307424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 1, 1 } 307524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The first index 1 is the child index for "class A" within class C 307624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 307724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 307824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// With omit_empty_base_classes == true we would get an integer array back with: 307924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 0, 1 } 308024943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 308124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The second index 1 is the child index for "m_b" within class A 308224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildMemberWithName 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3086b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3087462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes, 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t>& child_indexes 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 309224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 309424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 309603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 309703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 31007a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 310324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 310624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 310724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 310924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 311224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 311324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 311424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 311524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 311624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 311824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 311924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have to add on the number of base classes to this index! 312024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 312324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 312424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 312624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 312724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *parent_record_decl = cxx_record_decl; 312824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 312924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 313024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Didn't find things easily, lets let clang do its thang... 3133b01000fd063629facd45044f137446fb748ee179Greg Clayton IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name)); 313424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName decl_name(&ident_ref); 313524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths paths; 313724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 313824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner decl_name.getAsOpaquePtr(), 313924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner paths)) 314024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 314224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (path = paths.begin(); path != path_end; ++path) 314324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_path_elements = path->size(); 314524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t e=0; e<num_path_elements; ++e) 314624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 314724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXBasePathElement elem = (*path)[e]; 314824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 314924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 315024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 315124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 315324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 315424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 315524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 315624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 315724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 315824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 315924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 316124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclContext::lookup_iterator named_decl_pos; 316224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (named_decl_pos = path->Decls.first; 316324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner named_decl_pos != path->Decls.second && parent_record_decl; 316424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++named_decl_pos) 316524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 316624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 316724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 316924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (child_idx == UINT32_MAX) 317024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.clear(); 317224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 317324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 317524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 317624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes.push_back (child_idx); 317724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 317924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 318024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_indexes.size(); 318124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 318224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 318324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 318424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 318524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 318624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31879488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 31889488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 31897a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 31909488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31919488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 3192d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 31939488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 31949488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 31959488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 31969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 31979488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 31989488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 31999488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 32009488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32019488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 32029488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 32039488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3204823533e4fd5124e7d5dd26198a50bf9362317a5dGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 32059488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32069488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 32079488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32089488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 32099488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 32119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 32129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 32139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (child_idx); 32159488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 32169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32179488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 32209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // The super class index is always zero for ObjC classes, 32229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // so we push it onto the child indexes in case we find 32239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // an ivar in our superclass... 32249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.push_back (0); 32259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 3226b01000fd063629facd45044f137446fb748ee179Greg Clayton if (GetIndexOfChildMemberWithName (ast, 3227b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 32289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 32299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 32309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes)) 32319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 32329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We did find an ivar in a superclass so just 32339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // return the results! 32349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_indexes.size(); 32359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // We didn't find an ivar matching "name" in our 32389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // superclass, pop the superclass zero index that 32399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton // we pushed on above. 32409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes.pop_back(); 32419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 32469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 32489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3249b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 32509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 32519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 32529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes, 32539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton child_indexes); 32549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 32559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 32569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 32581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 325924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 326024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 326124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 326224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 326324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 326424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3265b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 326624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 326724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 326824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 326924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 327024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 327124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 327224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 327324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 327424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 327524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 327624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 327724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 327824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 328024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 328124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 328224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 328324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 328424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 328524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3286b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 328724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 328824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 328924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 329024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 329124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 329224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 32931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 32941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 329524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3296d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 329724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 329824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 329924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 330024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3301b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 330224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 330324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 330424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 330524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 330624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 330724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 330824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 330924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 331124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3312d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 331324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 331424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 331624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3317b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 331824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 331924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 332024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 332124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 332224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 332324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 332424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 332524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 332624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 332724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 332824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 332924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 333024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 333124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 333224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 333324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3334b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 333524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 333624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 333724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 333824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 333924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 334024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 334224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 334324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3345b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildMemberWithName (ast, 33469e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 334724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 334824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes, 334924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner child_indexes); 335024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 335224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 335324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 335524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 335624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 335724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 335924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the index of the child of "clang_type" whose name matches. This function 336024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// doesn't descend into the children, but only looks one level deep and name 336124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// matches can include base class names. 336224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 336324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 336424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetIndexOfChildWithName 336524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3366b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast, 3367462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t clang_type, 336824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 336924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool omit_empty_base_classes 337024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 337124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 337224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type && name && name[0]) 337324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 337424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 33759488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 337603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 33779488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 337803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 337924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 33817a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 338224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 338324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 338424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RecordDecl *record_decl = record_type->getDecl(); 338524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(record_decl); 338724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t child_idx = 0; 338824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 338924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 339024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 339124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cxx_record_decl) 339224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 339324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 339424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 339524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base_class != base_class_end; 339624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++base_class) 339724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 339824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Skip empty base classes 339924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 340024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 340124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue; 340224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3403b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType())); 3404b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton if (base_class_type_name.compare (name) == 0) 340524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 340624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++child_idx; 340724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 340824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 340924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 341024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and find a field that matches NAME 341124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RecordDecl::field_iterator field, field_end; 341224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef name_sref(name); 341324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 341424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner field != field_end; 341524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++field, ++child_idx) 341624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 341724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (field->getName().equals (name_sref)) 341824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return child_idx; 341924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 342124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 342224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 342324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: 34259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: 34267a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton if (GetCompleteQualType (ast, qual_type)) 34279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton StringRef name_sref(name); 3429d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 34309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton assert (objc_class_type); 34319488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (objc_class_type) 34329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton uint32_t child_idx = 0; 34349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 34359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (class_interface_decl) 34379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34389488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 34399488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 34409488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34419488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 34429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34439488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 34449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34459488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (ivar_decl->getName().equals (name_sref)) 34469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34479488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 34489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 34499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton ++child_idx; 34509488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34519488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return child_idx; 34529488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34539488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34559488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl) 34569488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 34579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 34589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton return 0; 34599488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34609488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34619488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34629488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34639488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 34649488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34659488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: 34669488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton { 3467b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 34689488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 34699488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton name, 34709488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton omit_empty_base_classes); 34719488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton } 34729488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton break; 34739488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 34741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 347524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 347624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 347724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// const uint64_t element_count = array->getSize().getLimitedValue(); 347824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 347924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx < element_count) 348024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3481b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 348224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 348324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char element_name[32]; 348424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 348524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 348624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(element_name); 348724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(field_type_info.first % 8 == 0); 348824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = field_type_info.first / 8; 348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = idx * child_byte_size; 349024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return array->getElementType().getAsOpaquePtr(); 349124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 349224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 349324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 349424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// case clang::Type::MemberPointerType: 349624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 349724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 349824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// QualType pointee_type = mem_ptr_type->getPointeeType(); 349924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 350024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 350124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3502b01000fd063629facd45044f137446fb748ee179Greg Clayton// return GetIndexOfChildWithName (ast, 350324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 350424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// name); 350524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 350624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 350724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 350824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 35091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 35101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 351124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3512d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 351324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = reference_type->getPointeeType(); 351424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 351524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 351624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3517b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 351824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reference_type->getPointeeType().getAsOpaquePtr(), 351924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 352024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 352124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 352224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 352324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 352424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 352624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3527d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 352824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType pointee_type = pointer_type->getPointeeType(); 352924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 353124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3532b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 353324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pointer_type->getPointeeType().getAsOpaquePtr(), 353424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 353524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 353624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 353724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 353824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 353924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (parent_name) 354024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 354124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name.assign(1, '*'); 354224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_name += parent_name; 354324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 354424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 354524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We have a pointer to an simple type 354624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (idx == 0) 354724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 3548b01000fd063629facd45044f137446fb748ee179Greg Clayton// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 354924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// assert(clang_type_info.first % 8 == 0); 355024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_size = clang_type_info.first / 8; 355124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// child_byte_offset = 0; 355224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return pointee_type.getAsOpaquePtr(); 355324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 355424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 355524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 355624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 355724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 3559b01000fd063629facd45044f137446fb748ee179Greg Clayton return GetIndexOfChildWithName (ast, 35609e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 356124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name, 356224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner omit_empty_base_classes); 356324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 356424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 356524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 356624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 356724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 356824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return UINT32_MAX; 356924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 357024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagType 357224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3574462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 357524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 357624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_clang_type) 357724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 357824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 3579d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = tag_qual_type.getTypePtr(); 358024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 358124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3582d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const TagType *tag_type = dyn_cast<TagType>(clang_type); 358324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 358424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 358524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 358624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 358724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 358824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->setTagKind ((TagDecl::TagKind)kind); 358924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 359024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 359424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 359524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 359624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 359824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark DeclContext Functions 359924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDeclContext * 3601462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetDeclContextForType (clang_type_t clang_type) 360224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 360324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 360424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 360524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 360703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 360803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 360924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36109488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionNoProto: break; 36119488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::FunctionProto: break; 36129488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::IncompleteArray: break; 36139488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::VariableArray: break; 36149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ConstantArray: break; 3615279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentSizedArray: break; 36169488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ExtVector: break; 3617279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentSizedExtVector: break; 36189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Vector: break; 36199488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Builtin: break; 36209488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::BlockPointer: break; 36219488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Pointer: break; 36229488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::LValueReference: break; 36239488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::RValueReference: break; 36249488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::MemberPointer: break; 36259488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Complex: break; 36269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObject: break; 36279488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 36289488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 36299488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 36309488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 36319e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 36329488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton 36339488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOfExpr: break; 36349488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TypeOf: break; 36359488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::Decltype: break; 36369488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton //case clang::Type::QualifiedName: break; 36379488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton case clang::Type::TemplateSpecialization: break; 3638279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentTemplateSpecialization: break; 3639279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::TemplateTypeParm: break; 3640279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::SubstTemplateTypeParm: break; 3641279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::SubstTemplateTypeParmPack:break; 3642279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::PackExpansion: break; 3643279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::UnresolvedUsing: break; 3644279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Paren: break; 3645279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Elaborated: break; 3646279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Attributed: break; 3647279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::Auto: break; 3648279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::InjectedClassName: break; 3649279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case clang::Type::DependentName: break; 365024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 365124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No DeclContext in this type... 365224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 365324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 365424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Namespace Declarations 365624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerNamespaceDecl * 365824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 365924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 366024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 366124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 366224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 366324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3664b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 366524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 3666b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 3667279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), &ast->Idents.get(name)); 366824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 366924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 367024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 367124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 367224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 367324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Function Types 367424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 367524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFunctionDecl * 3676462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 367724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 367824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name) 367924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3680b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3681b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 368224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 368324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (name && name[0]) 368424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3685b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3686b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 368724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3688279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 3689b01000fd063629facd45044f137446fb748ee179Greg Clayton DeclarationName (&ast->Idents.get(name)), 369024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 369124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 369224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 369324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 369424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 369524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 369624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 369724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3698b01000fd063629facd45044f137446fb748ee179Greg Clayton return FunctionDecl::Create(*ast, 3699b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 370024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3701279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 370224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DeclarationName (), 370324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType::getFromOpaquePtr(function_clang_type), 370424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 370524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 370624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (FunctionDecl::StorageClass)storage, 370724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_inline); 370824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 370924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 371024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 371124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 371224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3713462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3714b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast, 3715462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t result_type, 3716462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t *args, 37172ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned num_args, 37182ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan bool is_variadic, 37192ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan unsigned type_quals) 372024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3721b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 372224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<QualType> qual_type_args; 372324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (unsigned i=0; i<num_args; ++i) 372424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 372524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Detect calling convention in DWARF? 3727ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan FunctionProtoType::ExtProtoInfo proto_info; 3728ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Variadic = is_variadic; 3729279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan proto_info.ExceptionSpecType = EST_None; 3730ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.TypeQuals = type_quals; 3731279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan proto_info.RefQualifier = RQ_None; 3732ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.NumExceptions = 0; 3733ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info.Exceptions = NULL; 3734ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan 3735b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getFunctionType(QualType::getFromOpaquePtr(result_type), 373653d68e749f0715691a95f23e9490d97e484b15daGreg Clayton qual_type_args.empty() ? NULL : &qual_type_args.front(), 373724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner qual_type_args.size(), 3738ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan proto_info).getAsOpaquePtr(); // NoReturn); 373924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 374024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 374124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParmVarDecl * 3742462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 374324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3744b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3745b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 3746b01000fd063629facd45044f137446fb748ee179Greg Clayton return ParmVarDecl::Create(*ast, 3747b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->getTranslationUnitDecl(), 374824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SourceLocation(), 3749279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 3750b01000fd063629facd45044f137446fb748ee179Greg Clayton name && name[0] ? &ast->Idents.get(name) : NULL, 37512ea8f27fe76e30ba8fff1f58a50ad3e409e8a8baSean Callanan QualType::getFromOpaquePtr(param_type), 375224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 375324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 375424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (VarDecl::StorageClass)storage, 375524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); 375624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 375724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 375824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 375924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 376024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 376124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (function_decl) 376224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner function_decl->setParams (params, num_params); 376324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 376424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 376524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 376624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Array Types 376724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3768462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3769462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 377024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 377124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (element_type) 377224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3773b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3774b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 377524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_element_count (64, element_count); 3776b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 377724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ap_element_count, 377824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ArrayType::Normal, 377924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0).getAsOpaquePtr(); // ElemQuals 378024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 378124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 378224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 378324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 378424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 378524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark TagDecl 378624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 378724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3788462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 378924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 379024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 379124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 379224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3793d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *t = qual_type.getTypePtr(); 379424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (t) 379524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3796d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const TagType *tag_type = dyn_cast<TagType>(t); 379724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_type) 379824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 379924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TagDecl *tag_decl = tag_type->getDecl(); 380024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (tag_decl) 380124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 380224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner tag_decl->startDefinition(); 380324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 380424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 380824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 380924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 381024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 381124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 3812462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 381324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 381424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 381524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 381624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 381755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 381855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 381955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 382055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (cxx_record_decl) 382124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 382255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton cxx_record_decl->completeDefinition(); 382355b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 382455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 382555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton } 382655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3827d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 382804325065a00f646527db85e9bc751da29ac53b23Sean Callanan 382904325065a00f646527db85e9bc751da29ac53b23Sean Callanan if (objc_class_type) 383004325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 383104325065a00f646527db85e9bc751da29ac53b23Sean Callanan ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 383204325065a00f646527db85e9bc751da29ac53b23Sean Callanan 383304325065a00f646527db85e9bc751da29ac53b23Sean Callanan class_interface_decl->setForwardDecl(false); 383404325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 383504325065a00f646527db85e9bc751da29ac53b23Sean Callanan 383655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 383755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 383855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_type) 383955b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton { 384055b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 384155b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 384255b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton if (enum_decl) 384324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 384455b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton /// TODO This really needs to be fixed. 384555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 384655b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumPositiveBits = 1; 384755b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton unsigned NumNegativeBits = 0; 384855b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton 3849b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 385048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 385148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton QualType promotion_qual_type; 385248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // If the enum integer type is less than an integer in bit width, 385348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // then we must promote it to an integer size. 3854b01000fd063629facd45044f137446fb748ee179Greg Clayton if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) 385548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton { 385648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 3857b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->IntTy; 385848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 3859b01000fd063629facd45044f137446fb748ee179Greg Clayton promotion_qual_type = ast->UnsignedIntTy; 386048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton } 386148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton else 386248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton promotion_qual_type = enum_decl->getIntegerType(); 386348fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 386448fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 386555b6c534bb14111eb371d0665c3e3063769acdc9Greg Clayton return true; 386624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 386724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 386824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 386924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 387024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 387124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 387224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 387324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Enumeration Types 387424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3875462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 38760d62dfd4974eb23f550f992e594894b96c5696d1Greg ClaytonClangASTContext::CreateEnumerationType 38770d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton( 38780d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const char *name, 38790d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton DeclContext *decl_ctx, 38800d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton const Declaration &decl, 38810d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton clang_type_t integer_qual_type 38820d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton) 388324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 388424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 388524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3886b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 3887b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 388848fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 388948fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton // TODO: ask about these... 389048fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsScoped = false; 389148fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton// const bool IsFixed = false; 389248fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton 3893b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumDecl *enum_decl = EnumDecl::Create (*ast, 38940d62dfd4974eb23f550f992e594894b96c5696d1Greg Clayton decl_ctx, 389548fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 389648fbdf7ffd3c5e28e7b954ed92345c1c45256109Greg Clayton SourceLocation(), 3897279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan name && name[0] ? &ast->Idents.get(name) : NULL, 38989e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan NULL, 38999e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScoped 39009e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false, // IsScopedUsingClassTag 39019e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan false); // IsFixed 3902864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3903864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 390424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_decl) 3905e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton { 3906e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton // TODO: check if we should be setting the promotion type too? 3907e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 3908864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3909864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan enum_decl->setAccess(AS_public); // TODO respect what's in the debug info 3910864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 3911b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTagDeclType(enum_decl).getAsOpaquePtr(); 3912e37f23c664f91f38b77029159b29dc62ca19bcb0Greg Clayton } 391324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 391424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 391524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3916462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3917462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3918462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 3919462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3920462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton 3921d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = enum_qual_type.getTypePtr(); 3922462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (clang_type) 3923462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3924462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3925462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_type) 3926462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton { 3927462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 3928462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton if (enum_decl) 3929462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return enum_decl->getIntegerType().getAsOpaquePtr(); 3930462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3931462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton } 3932462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 3933462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 393424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 393524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::AddEnumerationValueToEnumerationType 393624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3937462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enum_clang_type, 3938462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton clang_type_t enumerator_clang_type, 393924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Declaration &decl, 394024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 394124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t enum_value, 394224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t enum_value_bit_size 394324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 394424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 394524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_clang_type && enumerator_clang_type && name) 394624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 394724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: Do something intelligent with the Declaration object passed in 394824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // like maybe filling in the SourceLocation with it... 3949b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 395024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 395124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3952b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 395324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 395424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 395524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3956d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *clang_type = enum_qual_type.getTypePtr(); 395724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 395824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 395924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 396024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 396124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enum_type) 396224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 396324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 396424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_llvm_apsint = enum_value; 396524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner EnumConstantDecl *enumerator_decl = 3966b01000fd063629facd45044f137446fb748ee179Greg Clayton EnumConstantDecl::Create (*ast, 3967b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_type->getDecl(), 3968b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 3969b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 3970b01000fd063629facd45044f137446fb748ee179Greg Clayton QualType::getFromOpaquePtr(enumerator_clang_type), 3971b01000fd063629facd45044f137446fb748ee179Greg Clayton NULL, 3972b01000fd063629facd45044f137446fb748ee179Greg Clayton enum_llvm_apsint); 3973b01000fd063629facd45044f137446fb748ee179Greg Clayton 397424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (enumerator_decl) 397524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 397624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner enum_type->getDecl()->addDecl(enumerator_decl); 397724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 397824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 397924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 398024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 398124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 398224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 398324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 398424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 398524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Pointers & References 398624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3987462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 3988462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreatePointerType (clang_type_t clang_type) 398924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return CreatePointerType (getASTContext(), clang_type); 3991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 3992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonclang_type_t 3994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type) 3995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{ 3996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (ast && clang_type) 39977b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 39987b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 39997b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 400003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 400103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 40027b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton { 40037b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCObject: 40047b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton case clang::Type::ObjCInterface: 4005427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 40067b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton 40077b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton default: 4008427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return ast->getPointerType(qual_type).getAsOpaquePtr(); 40097b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 40107b54103814527f5eeaa022d1a8a20cf8d2d864e5Greg Clayton } 401124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 401224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 401324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4014462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 40156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast, 40166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 401724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 401824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 40196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 402024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 402124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 402224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4023462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 40246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast, 40256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan clang_type_t clang_type) 402624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 402724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 40286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 402924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 403024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 403124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4032462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4033462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 4034fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton{ 4035fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton if (clang_pointee_type && clang_pointee_type) 4036fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 4037fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 4038fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton return NULL; 4039fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton} 4040fa97069b86f30aa44bb23a1de506ae220359b4faGreg Clayton 4041bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Claytonuint32_t 404224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetPointerBitSize () 404324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4044b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 4045b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypeSize(ast->VoidPtrTy); 404624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 404724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 404824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4049917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type) 4050917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{ 4051917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton QualType pointee_qual_type; 4052917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (clang_type) 4053917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4054917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4055917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 4056917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton bool success = false; 4057917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton switch (type_class) 4058917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4059917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Builtin: 4060917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId) 4061917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4062917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4063917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = clang_type; 4064917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4065917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4066917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4067917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4068917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::ObjCObjectPointer: 4069917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4070917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 4071917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4072917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4073917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Pointer: 4074917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType(); 4075917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = true; 4076917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4077917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4078917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::LValueReference: 4079917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::RValueReference: 4080917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType(); 4081917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = true; 4082917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4083917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4084917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Typedef: 4085917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type); 4086917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4087917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton default: 4088917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4089917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4090917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4091917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (success) 4092917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4093917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // Check to make sure what we are pointing too is a possible dynamic C++ type 4094917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We currently accept any "void *" (in case we have a class that has been 4095917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // watered down to an opaque pointer) and virtual C++ classes. 4096917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass(); 4097917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton switch (pointee_type_class) 4098917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4099917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Builtin: 4100917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind()) 4101917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4102917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UnknownAny: 4103917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Void: 4104917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4105917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 4106917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4107917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4108917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::NullPtr: 4109917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Bool: 4110917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char_U: 4111917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UChar: 4112917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::WChar_U: 4113917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char16: 4114917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char32: 4115917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UShort: 4116917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UInt: 4117917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ULong: 4118917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ULongLong: 4119917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::UInt128: 4120917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Char_S: 4121917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::SChar: 4122917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::WChar_S: 4123917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Short: 4124917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Int: 4125917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Long: 4126917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::LongLong: 4127917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Int128: 4128917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Float: 4129917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Double: 4130917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::LongDouble: 4131917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Dependent: 4132917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::Overload: 4133917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ObjCId: 4134917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ObjCClass: 4135917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::ObjCSel: 4136917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::BuiltinType::BoundMember: 4137917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4138917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4139917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4140917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4141917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::Record: 4142917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4143917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl(); 4144917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (cxx_record_decl) 4145917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4146917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (GetCompleteQualType (ast, pointee_qual_type)) 4147917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4148917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = cxx_record_decl->isDynamicClass(); 4149917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4150917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton else 4151917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4152917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // We failed to get the complete type, so we have to 4153917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // treat this as a void * which we might possibly be 4154917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton // able to complete 4155917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton success = true; 4156917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4157917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (success) 4158917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4159917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4160917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 4161917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4162917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4163917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4164917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4165917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4166917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4167917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::ObjCObject: 4168917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton case clang::Type::ObjCInterface: 4169917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4170917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton const clang::ObjCObjectType *objc_class_type = pointee_qual_type->getAsObjCQualifiedInterfaceType(); 4171917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (objc_class_type) 4172917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton { 4173917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton GetCompleteQualType (ast, pointee_qual_type); 4174917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4175917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 4176917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return true; 4177917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4178917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4179917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4180917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4181917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton default: 4182917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton break; 4183917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4184917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4185917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton } 4186917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton if (dynamic_pointee_type) 4187917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton *dynamic_pointee_type = NULL; 4188917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton return false; 4189917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton} 4190917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4191917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton 4192917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool 419382f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type) 419482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{ 419582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton QualType pointee_qual_type; 419682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (clang_type) 419782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 419882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 419982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 420082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton bool success = false; 420182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton switch (type_class) 420282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 420382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Pointer: 420482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType(); 420582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton success = true; 420682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 420782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 420882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::LValueReference: 420982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::RValueReference: 421082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType(); 421182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton success = true; 421282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 421382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 421482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Typedef: 421582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return ClangASTContext::IsPossibleCPlusPlusDynamicType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), dynamic_pointee_type); 421682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 421782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton default: 421882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 421982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 422082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 422182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (success) 422282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 422382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // Check to make sure what we are pointing too is a possible dynamic C++ type 422482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // We currently accept any "void *" (in case we have a class that has been 422582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // watered down to an opaque pointer) and virtual C++ classes. 422682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass(); 422782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton switch (pointee_type_class) 422882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 422982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Builtin: 423082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind()) 423182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 423282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UnknownAny: 423382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Void: 423482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (dynamic_pointee_type) 423582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 423682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return true; 423782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 423882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::NullPtr: 423982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Bool: 424082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char_U: 424182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UChar: 424282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::WChar_U: 424382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char16: 424482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char32: 424582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UShort: 424682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UInt: 424782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ULong: 424882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ULongLong: 424982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::UInt128: 425082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Char_S: 425182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::SChar: 425282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::WChar_S: 425382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Short: 425482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Int: 425582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Long: 425682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::LongLong: 425782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Int128: 425882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Float: 425982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Double: 426082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::LongDouble: 426182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Dependent: 426282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::Overload: 426382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ObjCId: 426482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ObjCClass: 426582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::ObjCSel: 426682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::BuiltinType::BoundMember: 426782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 426882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 426982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 427082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton case clang::Type::Record: 427182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 427282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl(); 427382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (cxx_record_decl) 427482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 427582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (GetCompleteQualType (ast, pointee_qual_type)) 427682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 42770f5e6f1a01b340d463fbdc692f3af492774a5ec4Greg Clayton success = cxx_record_decl->isDynamicClass(); 427882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 427982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton else 428082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 428182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // We failed to get the complete type, so we have to 428282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // treat this as a void * which we might possibly be 428382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton // able to complete 428482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton success = true; 428582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 428682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (success) 428782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton { 428882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (dynamic_pointee_type) 428982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr(); 429082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return true; 429182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 429282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 429382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 429482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 429582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 429682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton default: 429782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton break; 429882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 429982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 430082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton } 430182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton if (dynamic_pointee_type) 430282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton *dynamic_pointee_type = NULL; 430382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton return false; 430482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton} 430582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 430682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton 430782f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool 4308462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 430924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 431024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type == NULL) 431124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 431224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 431324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 431403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 431503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 431624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 431704325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 431804325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 431904325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 432004325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 432104325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 432204325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 432304325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 432404325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 432504325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 432604325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 43271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 432824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 432924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 433024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 433224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 433324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 433424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 433624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 433724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 433824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 434024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 434124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 434224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::LValueReference: 434424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 434524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 434624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::RValueReference: 434824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 434924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 435024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 43529e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 435324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 435424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 435524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 435624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 435724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 435824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 435924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4360462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 436124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 436224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 436324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 436424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 436524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 436624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 436724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 436824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type) 436924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 437024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (builtin_type->isInteger()) 437124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_signed = builtin_type->isSignedInteger(); 437224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 437324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 437424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 437524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 437624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 437724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 437824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 437924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4380462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 438124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 438224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 438324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 438424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 438503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 438603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 438724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 438804325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::Type::Builtin: 438904325065a00f646527db85e9bc751da29ac53b23Sean Callanan switch (cast<clang::BuiltinType>(qual_type)->getKind()) 439004325065a00f646527db85e9bc751da29ac53b23Sean Callanan { 439104325065a00f646527db85e9bc751da29ac53b23Sean Callanan default: 439204325065a00f646527db85e9bc751da29ac53b23Sean Callanan break; 439304325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCId: 439404325065a00f646527db85e9bc751da29ac53b23Sean Callanan case clang::BuiltinType::ObjCClass: 439504325065a00f646527db85e9bc751da29ac53b23Sean Callanan return true; 439604325065a00f646527db85e9bc751da29ac53b23Sean Callanan } 439704325065a00f646527db85e9bc751da29ac53b23Sean Callanan return false; 43981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ObjCObjectPointer: 439924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 440024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 440124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::BlockPointer: 440324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 440424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 440524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Pointer: 440724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 440824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 440924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::MemberPointer: 441124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_type) 441224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 441324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 44141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 44159e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type); 441624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 441724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 441824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 441924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 442024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 442124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 442224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 442324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4424462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 442524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 442624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 442724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 442824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 442924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 443024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 443124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 443224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::BuiltinType::Kind kind = BT->getKind(); 443324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 443424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 443524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 1; 443624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 443724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 443824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 443924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 444024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 444124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 444224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 444324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 444424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = 2; 444524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = true; 444624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 444724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 444824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 444924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 445024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 445124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 445224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 445324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner count = VT->getNumElements(); 445424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner is_complex = false; 445524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 445624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 445724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 445824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 445924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 446024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 446124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4462bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4463bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonbool 4464bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 4465bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{ 4466bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (clang_type) 4467bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4468bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4469bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4470bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 4471bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (cxx_record_decl) 4472bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton { 4473bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 4474bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return true; 4475bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4476bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton } 4477bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton class_name.clear(); 4478bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return false; 4479bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton} 4480bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 4481bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 44821d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4483462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCXXClassType (clang_type_t clang_type) 44841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 44851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 44861d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 44871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 44881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 44891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 44901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 44911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 44921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 44931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 44941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Claytonbool 4495462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsObjCClassType (clang_type_t clang_type) 44961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{ 44971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (clang_type) 44981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton { 44991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 45001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 45011d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return true; 45021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton } 45031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton return false; 45041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton} 45051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 45061d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton 4507f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonbool 4508f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::IsCharType (clang_type_t clang_type) 4509f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4510f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4511f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return QualType::getFromOpaquePtr(clang_type)->isCharType(); 4512f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4513f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 451424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 451524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4516462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 451724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4518f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton clang_type_t pointee_or_element_clang_type = NULL; 4519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 4520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4521f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_clang_type == NULL) 4522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 4523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4524f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 452524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4526f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 4527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 4528f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 452924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4530f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4531f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (type_flags.Test (eTypeIsArray)) 453224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4533f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // We know the size of the array and it could be a C string 4534f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton // since it is an array of characters 4535f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 4536f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 453724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4538f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton else 453924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4540f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton length = 0; 4541f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return true; 454224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 454324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 454424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 454524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 454624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 454724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 454824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 454924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4550462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 455103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{ 455203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (clang_type) 455303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 455403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 455503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 455603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (qual_type->isFunctionPointerType()) 455703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return true; 455803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 455903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 456003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 456103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 4562279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan default: 4563279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 456403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::Typedef: 45659e7958e3d89fbcb8128bd224161cdccd3bf4ad9dSean Callanan return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 456603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 456703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::LValueReference: 456803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton case clang::Type::RValueReference: 456903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton { 4570d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 457103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton if (reference_type) 457203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 457303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 457403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton break; 457503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 457603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton } 457703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton return false; 457803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton} 457903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 4580f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonsize_t 4581f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonClangASTContext::GetArraySize (clang_type_t clang_type) 4582f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{ 4583f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (clang_type) 4584f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton { 4585d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 4586f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (array) 4587f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return array->getSize().getLimitedValue(); 4588f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton } 4589f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return 0; 4590f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton} 459103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton 459203e0f97cfa469792dd69b36f782d33a014225788Greg Claytonbool 4593462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 459424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 459524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!clang_type) 459624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 459724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 459824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 459924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 460003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 460103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton switch (type_class) 460224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4603279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan default: 4604279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 46051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 460624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 460724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 460824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 4609381f968161e2274c55706ead0baed444a26b5092Greg Clayton *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX); 461024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 46111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::IncompleteArray: 461224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 461324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 461424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 461524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 461624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 46171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::VariableArray: 461824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 461924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 462024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 462124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 46225aad3f5581aec9ee62277d92b11cba7abf837dbdGreg Clayton return true; 46231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::DependentSizedArray: 462424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (member_type) 462524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 462624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (size) 462724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *size = 0; 462824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 462924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 463024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 463124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 463224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 463324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 463424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Typedefs 463524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4636462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonclang_type_t 4637462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 463824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 463924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 464024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 464124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4642b01000fd063629facd45044f137446fb748ee179Greg Clayton ASTContext *ast = getASTContext(); 464324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IdentifierTable *identifier_table = getIdentifierTable(); 4644b01000fd063629facd45044f137446fb748ee179Greg Clayton assert (ast != NULL); 464524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (identifier_table != NULL); 464624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (decl_ctx == NULL) 4647b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx = ast->getTranslationUnitDecl(); 4648b01000fd063629facd45044f137446fb748ee179Greg Clayton TypedefDecl *decl = TypedefDecl::Create (*ast, 4649b01000fd063629facd45044f137446fb748ee179Greg Clayton decl_ctx, 4650b01000fd063629facd45044f137446fb748ee179Greg Clayton SourceLocation(), 4651279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan SourceLocation(), 4652b01000fd063629facd45044f137446fb748ee179Greg Clayton name ? &identifier_table->get(name) : NULL, // Identifier 4653b01000fd063629facd45044f137446fb748ee179Greg Clayton ast->CreateTypeSourceInfo(qual_type)); 4654864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan 4655864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan decl->setAccess(AS_public); // TODO respect proper access specifier 465624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 465724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get a uniqued QualType for the typedef decl type 4658b01000fd063629facd45044f137446fb748ee179Greg Clayton return ast->getTypedefType (decl).getAsOpaquePtr(); 465924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 466024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 466124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 466224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 466324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float 466424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad 466524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally 466624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics 466724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to 466824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt. 466924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool 4670b01000fd063629facd45044f137446fb748ee179Greg 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) 467124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 467224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t count = 0; 467324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_complex = false; 467424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 467524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 467624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bytes_per_float = byte_size / count; 467724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned num_bits_per_float = num_bytes_per_float * 8; 467824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 467924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.clear(); 468024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// uint32_t i; 468124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// for (i=0; i<count; i++) 468224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 468324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 468424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool is_ieee = false; 468524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// APFloat ap_float(ap_int, is_ieee); 468624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// char s[1024]; 468724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// unsigned int hex_digits = 0; 468824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// bool upper_case = false; 468924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 469024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 469124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 469224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i > 0) 469324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(", "); 469424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(s); 469524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (i == 1 && is_complex) 469624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// float_str.append(1, 'i'); 469724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 469824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 469924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return !float_str.empty(); 470024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 470124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 470224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 470324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 470424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 4705b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 470624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 470724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (clang_type) 470824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 470924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 471024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t count = 0; 471124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_complex = false; 471224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 471324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 471424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // TODO: handle complex and vector types 471524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (count != 1) 471624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 471724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 471824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringRef s_sref(s); 4719b01000fd063629facd45044f137446fb748ee179Greg Clayton APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref); 472024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4721b01000fd063629facd45044f137446fb748ee179Greg Clayton const uint64_t bit_size = ast->getTypeSize (qual_type); 472224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t byte_size = bit_size / 8; 472324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_size >= byte_size) 472424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 472524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bit_size == sizeof(float)*8) 472624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 472724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner float float32 = ap_float.convertToFloat(); 472824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, &float32, byte_size); 472924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 473024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 473124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (bit_size >= 64) 473224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 473324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner llvm::APInt ap_int(ap_float.bitcastToAPInt()); 473424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, ap_int.getRawData(), byte_size); 473524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return byte_size; 473624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 473724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 473824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 473924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 474024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 474124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4742a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4743a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callananunsigned 4744462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 4745a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan{ 4746a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan assert (clang_type); 4747a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4748a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4749a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan 4750a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan return qual_type.getQualifiers().getCVRQualifiers(); 4751a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan} 4752b01000fd063629facd45044f137446fb748ee179Greg Clayton 4753b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4754b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type) 4755b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4756b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type == NULL) 4757b01000fd063629facd45044f137446fb748ee179Greg Clayton return false; 4758b01000fd063629facd45044f137446fb748ee179Greg Clayton 47597a183dc05d0b860e5b4b523f27e2a9804e49af62Greg Clayton return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type)); 4760b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4761b01000fd063629facd45044f137446fb748ee179Greg Clayton 4762b01000fd063629facd45044f137446fb748ee179Greg Clayton 4763b01000fd063629facd45044f137446fb748ee179Greg Claytonbool 4764b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetCompleteType (clang_type_t clang_type) 4765b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 4766b01000fd063629facd45044f137446fb748ee179Greg Clayton return ClangASTContext::GetCompleteType (getASTContext(), clang_type); 4767b01000fd063629facd45044f137446fb748ee179Greg Clayton} 4768b01000fd063629facd45044f137446fb748ee179Greg Clayton 4769e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Claytonbool 4770e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg ClaytonClangASTContext::GetCompleteDecl (clang::ASTContext *ast, 4771e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton clang::Decl *decl) 4772e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 4773e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!decl) 4774e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4775e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4776e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ExternalASTSource *ast_source = ast->getExternalSource(); 4777e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4778e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!ast_source) 4779e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4780e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4781e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl)) 4782e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 4783e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (tag_decl->getDefinition()) 4784e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return true; 4785e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4786e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!tag_decl->hasExternalLexicalStorage()) 4787e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4788e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4789e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ast_source->CompleteType(tag_decl); 4790e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4791e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return !tag_decl->getTypeForDecl()->isIncompleteType(); 4792e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 4793e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl)) 4794e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 4795e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!objc_interface_decl->isForwardDecl()) 4796e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return true; 4797e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4798e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (!objc_interface_decl->hasExternalLexicalStorage()) 4799e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4800e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4801e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ast_source->CompleteType(objc_interface_decl); 4802e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4803e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return !objc_interface_decl->isForwardDecl(); 4804e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 4805e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton else 4806e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 4807e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton return false; 4808e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 4809e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 4810e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 4811